>Добрый день!
>Есть дата в формате 01-190 (дни,прошедшие с начала года,это НЕ вывод ls)
>Надо 03.06.2001 (к примеру, точно не пересчитывал) Так вот, КАК пересчитать
>дни от начала года в привычный вид (с разбивкой по месяцам).
>
>Хотя бы примерный алгоритм.
>Заранее спасибо.
Something like this:
/*
**
** !!! WARNING !!! Just skeleton of the code. Was not compiled! May be has errors
**
*/
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <errno.h>
#include <string.h>
#include <time.h>
void usage( char *prog )
{
fprintf( stderr, "USAGE: %s %%y-%%j\n\nSee man strftime for format\n", prog );
exit( EXIT_FAILURE );
}
void fatal_error( char *msg )
{
fprintf( stderr, "ERROR: %s\n", msg );
exit( EXIT_FAILURE );
}
/* [min, max] - inclusive */
int str2int( char *s, char *eos_ptr, int min, int max, char *prog )
{
int res = (int)strtol( s, &eos_ptr, 10 );
if ( res == 0 && (errno == EINVAL || errno == ERANGE) )
usage( prog );
if ( res < min || res > max )
usage( prog );
return res;
}
struct tm *prep_input_date( char *sdt, char *prog )
{
char *y = strsep( &sdt, "-" );
char *d = sdt;
int yr, dt;
time_t t;
struct tm *ptm;
if ( y != NULL && d != NULL ) {
yr = str2int( y, y + 2, 0, 99, prog );
dt = str2int( d, d + 3, 1, 366, prog );
}
time( &t );
ptm = gmtime( &t );
/* prepare year for tm (assuming our date is in the same century)*/
yr += ((ptm->tm_year)/100)*100;
memset( ptm, 0, sizeof( *ptm ) );
ptm->tm_year = yr;
ptm->tm_mday = dt;
/* adjust other struct memebers */
mktime( ptm );
return ptm;
}
#define SZ 11
int main( int argc, char **argv )
{
struct tm *ptm;
time_t t;
char buf[ SZ ];
if ( argc != 2 ) usage( argv[ 0 ] );
ptm = prep_input_date( argv[ 1 ], argv[ 0 ] );
fprintf( stdout, "Direct: %d/%d/%d\n", ptm->tm_mday, 1 + ptm->tm_mon, 1900 + ptm->tm_year );
/* --- or --- */
strftime( buf, sizeof( buf ), "%d/%m/%Y", ptm );
fprintf( stdout, "strftime: %s\n", buf );
return EXIT_SUCCESS;
}
Good luck
--- sas