The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Unix.Перевод времени из формата 'от начала года' в стандартн..."
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Unix.Перевод времени из формата 'от начала года' в стандартн..."
Сообщение от MikeK Искать по авторуВ закладки on 11-Авг-03, 11:57  (MSK)
Добрый день!
Есть дата в формате 01-190 (дни,прошедшие с начала года,это НЕ вывод ls) Надо 03.06.2001 (к примеру, точно не пересчитывал) Так вот, КАК пересчитать дни от начала года в привычный вид (с разбивкой по месяцам).
Хотя бы примерный алгоритм.
Заранее спасибо.
  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Unix.Перевод времени из формата 'от начала года' в стандартн..."
Сообщение от sas emailИскать по авторуВ закладки on 11-Авг-03, 12:47  (MSK)
>Добрый день!
>Есть дата в формате 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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Unix.Перевод времени из формата 'от начала года' в стандартн..."
Сообщение от igor emailИскать по авторуВ закладки on 14-Авг-03, 12:00  (MSK)
>>Есть дата в формате 01-190
>>Надо 03.06.

Берём любой известный год за опорный.
Единица измерения - день.
Прибавляем годы до нужного с учётом год%4=0 - високосный.
365+365+365+366+...
Далее прибавляем месяцы до нужного дня.
31+28+31+...
Далее прибавляем дни , пока не дойдём до нужного.
Сотни две сложений это немного - как несколько умножений.
Попутно можно день недели посчитать делением на 7 получившегося числа.
Вряд ли здесь нужна супер эффективность.

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру