UTC
10 отговора
311 прегледа
UTC
Как мога да конвентирам до YYYY.MM.DD hh:mm:ss.s
ако имам секундите които са минали от 01.01.1980 год. до сега?
10х
ако имам секундите които са минали от 01.01.1980 год. до сега?
10х
Re: UTC
ami ako pishehs na C(++) izpolzwai gmtime()
samo che tia smiata spriamo 1/1/1970 no towa lesno se fix-wa
s edna konstatnta koiato e broia sekundi za 1/1/1970-1/1/1980
samo che tia smiata spriamo 1/1/1970 no towa lesno se fix-wa
s edna konstatnta koiato e broia sekundi za 1/1/1970-1/1/1980
Re: UTC
:)))
ako si s windows i si instaliral Visual C w program files -
%ProgramFiles%\Microsoft Visual Studio\VC98\CRT\SRC\gmtime.c
ako go niamash kaji si maila da ti go pratia :)
------gmtime.c----------
int _ldays ??( ??) = { 31,29,31,30,.......................
int _days ??( ??) = { 31,28,31,30,.......................
struct tm * __cdecl gmtime (
const time_t *timp
)
{
long caltim = *timp; /* calendar time to convert */
int islpyr = 0; /* is-current-year-a-leap-year flag */
REG1 int tmptim;
REG3 int *mdays; /* pointer to days or lpdays */
#ifdef _MT
REG2 struct tm *ptb; /* will point to gmtime buffer */
_ptiddata ptd = _getptd();
#else /* _MT */
REG2 struct tm *ptb = &tb;
#endif /* _MT */
if ( caltim < 0L )
return(NULL);
#ifdef _MT
/* Use per thread buffer area (malloc space, if necessary) */
if ( (ptd->_gmtimebuf != NULL) || ((ptd->_gmtimebuf =
_malloc_crt(sizeof(struct tm))) != NULL) )
ptb = ptd->_gmtimebuf;
else
ptb = &tb; /* malloc error: use static buffer */
#endif /* _MT */
/*
* Determine years since 1970. First, identify the four-year interval
* since this makes handling leap-years easy (note that 2000 IS a
* leap year and 2100 is out-of-range).
*/
tmptim = (int)(caltim / _FOUR_YEAR_SEC);
caltim -= ((long)tmptim * _FOUR_YEAR_SEC);
/*
* Determine which year of the interval
*/
tmptim = (tmptim * 4) + 70; /* 1970, 1974, 1978,...,etc. */
if ( caltim >= _YEAR_SEC ) {
tmptim++; /* 1971, 1975, 1979,...,etc. */
caltim -= _YEAR_SEC;
if ( caltim >= _YEAR_SEC ) {
tmptim++; /* 1972, 1976, 1980,...,etc. */
caltim -= _YEAR_SEC;
/*
* Note, it takes 366 days-worth of seconds to get past a leap
* year.
*/
if ( caltim >= (_YEAR_SEC + _DAY_SEC) ) {
tmptim++; /* 1973, 1977, 1981,...,etc. */
caltim -= (_YEAR_SEC + _DAY_SEC);
}
else {
/*
* In a leap year after all, set the flag.
*/
islpyr++;
}
}
}
/*
* tmptim now holds the value for tm_year. caltim now holds the
* number of elapsed seconds since the beginning of that year.
*/
ptb->tm_year = tmptim;
/*
* Determine days since January 1 (0 - 365). This is the tm_yday value.
* Leave caltim with number of elapsed seconds in that day.
*/
ptb->tm_yday = (int)(caltim / _DAY_SEC);
caltim -= (long)(ptb->tm_yday) * _DAY_SEC;
/*
* Determine months since January (0 - 11) and day of month (1 - 31)
*/
if ( islpyr )
mdays = _lpdays;
else
mdays = _days;
for ( tmptim = 1 ; mdays ??( tmptim ??) < ptb->tm_yday ; tmptim++ ) ;
ptb->tm_mon = --tmptim;
ptb->tm_mday = ptb->tm_yday - mdays ??( tmptim ??);
/*
* Determine days since Sunday (0 - 6)
*/
ptb->tm_wday = ((int)(*timp / _DAY_SEC) + _BASE_DOW) % 7;
/*
* Determine hours since midnight (0 - 23), minutes after the hour
* (0 - 59), and seconds after the minute (0 - 59).
*/
ptb->tm_hour = (int)(caltim / 3600);
caltim -= (long)ptb->tm_hour * 3600L;
ptb->tm_min = (int)(caltim / 60);
ptb->tm_sec = (int)(caltim - (ptb->tm_min) * 60);
ptb->tm_isdst = 0;
return( (struct tm *)ptb );
}
ako si s windows i si instaliral Visual C w program files -
%ProgramFiles%\Microsoft Visual Studio\VC98\CRT\SRC\gmtime.c
ako go niamash kaji si maila da ti go pratia :)
------gmtime.c----------
int _ldays ??( ??) = { 31,29,31,30,.......................
int _days ??( ??) = { 31,28,31,30,.......................
struct tm * __cdecl gmtime (
const time_t *timp
)
{
long caltim = *timp; /* calendar time to convert */
int islpyr = 0; /* is-current-year-a-leap-year flag */
REG1 int tmptim;
REG3 int *mdays; /* pointer to days or lpdays */
#ifdef _MT
REG2 struct tm *ptb; /* will point to gmtime buffer */
_ptiddata ptd = _getptd();
#else /* _MT */
REG2 struct tm *ptb = &tb;
#endif /* _MT */
if ( caltim < 0L )
return(NULL);
#ifdef _MT
/* Use per thread buffer area (malloc space, if necessary) */
if ( (ptd->_gmtimebuf != NULL) || ((ptd->_gmtimebuf =
_malloc_crt(sizeof(struct tm))) != NULL) )
ptb = ptd->_gmtimebuf;
else
ptb = &tb; /* malloc error: use static buffer */
#endif /* _MT */
/*
* Determine years since 1970. First, identify the four-year interval
* since this makes handling leap-years easy (note that 2000 IS a
* leap year and 2100 is out-of-range).
*/
tmptim = (int)(caltim / _FOUR_YEAR_SEC);
caltim -= ((long)tmptim * _FOUR_YEAR_SEC);
/*
* Determine which year of the interval
*/
tmptim = (tmptim * 4) + 70; /* 1970, 1974, 1978,...,etc. */
if ( caltim >= _YEAR_SEC ) {
tmptim++; /* 1971, 1975, 1979,...,etc. */
caltim -= _YEAR_SEC;
if ( caltim >= _YEAR_SEC ) {
tmptim++; /* 1972, 1976, 1980,...,etc. */
caltim -= _YEAR_SEC;
/*
* Note, it takes 366 days-worth of seconds to get past a leap
* year.
*/
if ( caltim >= (_YEAR_SEC + _DAY_SEC) ) {
tmptim++; /* 1973, 1977, 1981,...,etc. */
caltim -= (_YEAR_SEC + _DAY_SEC);
}
else {
/*
* In a leap year after all, set the flag.
*/
islpyr++;
}
}
}
/*
* tmptim now holds the value for tm_year. caltim now holds the
* number of elapsed seconds since the beginning of that year.
*/
ptb->tm_year = tmptim;
/*
* Determine days since January 1 (0 - 365). This is the tm_yday value.
* Leave caltim with number of elapsed seconds in that day.
*/
ptb->tm_yday = (int)(caltim / _DAY_SEC);
caltim -= (long)(ptb->tm_yday) * _DAY_SEC;
/*
* Determine months since January (0 - 11) and day of month (1 - 31)
*/
if ( islpyr )
mdays = _lpdays;
else
mdays = _days;
for ( tmptim = 1 ; mdays ??( tmptim ??) < ptb->tm_yday ; tmptim++ ) ;
ptb->tm_mon = --tmptim;
ptb->tm_mday = ptb->tm_yday - mdays ??( tmptim ??);
/*
* Determine days since Sunday (0 - 6)
*/
ptb->tm_wday = ((int)(*timp / _DAY_SEC) + _BASE_DOW) % 7;
/*
* Determine hours since midnight (0 - 23), minutes after the hour
* (0 - 59), and seconds after the minute (0 - 59).
*/
ptb->tm_hour = (int)(caltim / 3600);
caltim -= (long)ptb->tm_hour * 3600L;
ptb->tm_min = (int)(caltim / 60);
ptb->tm_sec = (int)(caltim - (ptb->tm_min) * 60);
ptb->tm_isdst = 0;
return( (struct tm *)ptb );
}
Re: UTC
не знам защо реши че имам С
нищо не разбирам от това, което си ми пратил
трябва ми просто алгоритъм
нещо такова:
година = UTC div 3600*24*360
месец = ....
ден = ...
час =...
...
нищо не разбирам от това, което си ми пратил
трябва ми просто алгоритъм
нещо такова:
година = UTC div 3600*24*360
месец = ....
ден = ...
час =...
...
Re: UTC
mislia che niakolko pyti spomenah "ako imash C"
ta ako si pascaldjia - mi smeniash { } s begin i end i gore dolu e
syshtoto
operatora
x -= y e wse edno x = x - y
p->x e ^p.x ako ne me lyje pametta wytre w tialoto na
/ za int chisla e div a % e mod ...
wytre sa samo smetki i niakolko if-a ne wijdam kakyw ti e problema...
ako iskash si wij sourcowete na rtl na niakoi paskal za podobna
funkcia...
myrzi me da sedna i da ti go prewejdam na pascal :)
ta ako si pascaldjia - mi smeniash { } s begin i end i gore dolu e
syshtoto
operatora
x -= y e wse edno x = x - y
p->x e ^p.x ako ne me lyje pametta wytre w tialoto na
/ za int chisla e div a % e mod ...
wytre sa samo smetki i niakolko if-a ne wijdam kakyw ti e problema...
ako iskash si wij sourcowete na rtl na niakoi paskal za podobna
funkcia...
myrzi me da sedna i da ti go prewejdam na pascal :)
Re: UTC
Би трябвало да се направи нещо като цикъл, който последователно да изважда секундите за всеки ден от 80 год насам, като се отчита месеца - колко дни има и дали годината е високосна (за февруари :-) Тоя цикъл ше се върти докато секундите ти намалеят под 1 ден, тогава се свежда до математика за пресмятането на часа и минутите, секундите са остатъка...
Дърварско е, ама в момента не ми се мисли много много :-)
Дърварско е, ама в момента не ми се мисли много много :-)
Re: UTC
Не e трудно и не е нужно и да му се мисли много, а само да се погледне във VC++ сорсовете на CTime, CTimeSpan, COleDateTime, COleDateTimeSpan ... нали го има сорса и Span-версиите смятат много добре с дата и време.
Re: UTC
Shte se opitam da ti definiram Gregorianskiya kalendar.
Sekunda: pyrvichno ponyatie
Minuta: 60 sekundi
Chas: 60 minuti
Denonoshtie: 24 chasa
Mesec: systoi se ot n denonoshtiya, nomerirani ot 1 natam.
Yanuari: 31 dni
Fevruari: 28 dni (29 dni, ako godinata e visokosna)
Mart: 31 dni
April: 30 dni
May: 31 dni
Yuni: 30 dni
Yuli: 31 dni
Avgust: 31 dni
Septemvri: 30 dni
Oktomvri: 31 dni
Noemvri: 30 dni
Dekemvri: 31 dni
Godina (po-slojno ponyatie):
Godinata e cyalo chislo sys znak (samo 0 ne e validna godina). Neynata prodyljitelnost e sumata ot prodyljitelnostite na vsichki meseci.
Godinata e visokosna, ako:
1. se deli na 400
ili
2. ne se deli na 100 i se deli na 4.
1.01.1 00:00:00 se naricha nachalo na novata era. Momentyt predi nego e 31.12.-1 23:59:59.
Ne e super tochno definirano (edin izvynzemen edva li bi go chatnal napylno :-), ama po tova veche mislya, che mojesh da si napravish klas, koyto po zadadeni vremevi koordinati (godina, mesec, denonoshtie, chas, minuta, sekunda) da ti dava broy sekundi ot nachaloto na novata era. Kakto i obratnoto. Moje da pravish otmestvane i spryamo 1.01.1980, ako iskash. Imay predvid, che sekundite ot 1.01.1 do sega ne se pobirat v 32 bita.
Eto tuk ima neshto podobno, ama sym go pisal za 16-bitova arhitektura, zatova ne poddyrja sekundi (long ne e 64-bitov):
[линк]
(daje ima i nyakakvi komentari v headera, cp1251 kirilica).
Sekunda: pyrvichno ponyatie
Minuta: 60 sekundi
Chas: 60 minuti
Denonoshtie: 24 chasa
Mesec: systoi se ot n denonoshtiya, nomerirani ot 1 natam.
Yanuari: 31 dni
Fevruari: 28 dni (29 dni, ako godinata e visokosna)
Mart: 31 dni
April: 30 dni
May: 31 dni
Yuni: 30 dni
Yuli: 31 dni
Avgust: 31 dni
Septemvri: 30 dni
Oktomvri: 31 dni
Noemvri: 30 dni
Dekemvri: 31 dni
Godina (po-slojno ponyatie):
Godinata e cyalo chislo sys znak (samo 0 ne e validna godina). Neynata prodyljitelnost e sumata ot prodyljitelnostite na vsichki meseci.
Godinata e visokosna, ako:
1. se deli na 400
ili
2. ne se deli na 100 i se deli na 4.
1.01.1 00:00:00 se naricha nachalo na novata era. Momentyt predi nego e 31.12.-1 23:59:59.
Ne e super tochno definirano (edin izvynzemen edva li bi go chatnal napylno :-), ama po tova veche mislya, che mojesh da si napravish klas, koyto po zadadeni vremevi koordinati (godina, mesec, denonoshtie, chas, minuta, sekunda) da ti dava broy sekundi ot nachaloto na novata era. Kakto i obratnoto. Moje da pravish otmestvane i spryamo 1.01.1980, ako iskash. Imay predvid, che sekundite ot 1.01.1 do sega ne se pobirat v 32 bita.
Eto tuk ima neshto podobno, ama sym go pisal za 16-bitova arhitektura, zatova ne poddyrja sekundi (long ne e 64-bitov):
[линк]
(daje ima i nyakakvi komentari v headera, cp1251 kirilica).
Re: UTC
Абе човекът няколко пъти каза че не иска сорс, а алгоритъм. Кво става, ако не чатка VCPP? Да гледа сорсовете на VCL ли?