I would like for this function to be able to return data from the given time_t
argument according to the specifier
argument.
If specifier is 'd'
, it should return the Day of the month (01-31);
If specifier is 'W'
, it should return the Week of the year (00-53).
int get_number_atr_from_time(time_t raw_time, char specifier) {
struct tm *info = localtime(&raw_time);
char buffer[3];
strftime(buffer, 3, "%specifier", info);
return atoi(buffer);
}
Can this somehow be done?
CodePudding user response:
Many (if not most) of the standard C functions that take a "format" argument, such as printf
and – as in your code – strftime
, take that argument as a const char*
. However, that does not mean it has to be a string literal.
Any char
array that you have declared and written-to yourself (i.e. not const
) can still be passed as a const char*
argument. So, you can write the required format specifier to a pre-declared format
array and then pass that to the strftime
function.
In the following code, I show how you can do this to get the current day-of-month and week-of-year, passing 'd'
and 'W'
, respectively, to your function, which then writes that (together with the required %
prefix) to the format string used for the strftime
call.
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
int get_number_atr_from_time(time_t raw_time, char specifier)
{
struct tm* info = localtime(&raw_time);
char buffer[3];
char format[3] = { '%', specifier, 0 }; // Initialize as "%X", where X is
strftime(buffer, 3, format, info); // "specifier" - and add null char
return atoi(buffer);
}
int main(void)
{
time_t tNow = time(NULL);
int dy = get_number_atr_from_time(tNow, 'd');
int wk = get_number_atr_from_time(tNow, 'W');
printf("D = %d, W = %d\n", dy, wk);
return 0;
}
Output as of the date of posting:
D = 13, W = 45
Note that there will be a number of more efficient ways to retrieve the day and week values from a time_t
or struct tm
value, but the above code shows how to solve your specific problem.
CodePudding user response:
Simply use compound literal:
strftime(buffer, 3, (char []){'%', specifier, 0}, info);