=?Utf-8?Q?Re:_Storing_=E2=80=9C_24_Aug_2007_01:25:?=
=?Utf-8?Q?20_GMT_=E2=80=9D_as_=E2=80=9C_BSYX5W_=E2=80=9D_=28_Base62_?=
=?Utf-8?Q?=29.?=
Jeff, that's an awful lot of code for getting the wrong answer.
There aren't 365.0 days in a year, and there aren't 30.5 days in a month.
In fact, the two don't even agree. You haven't even removed the dependency
on the standard time manipulations, because I see calls to time and
localtime in there (nevermind, that's just if no date is passed in string
form). If you're going to write your own date parser, you ought to at least
use a switch statement to match the month in trie time instead of a linear
search. And "Mega Minutes"? C'mon! You also seem to be quite intolerant
of alternate date orders and localized month names.
"Jeff???Relf" <Jeff_Relf@Yahoo.COM> wrote in message
news:Jeff_Relf_2007_Aug_24__6_32_PV@Cotse.NET...
By default, in VC8,
??? time_t ??? is a count of seconds since 1970 in an ??? __int64 ???.
I store ??? 24 Aug 2007 01:25:20 GMT ??? as ??? BSYX5W ??? ( Base62 ).
...............
#undef _DEBUG
#define UNICODE
#define _WIN32_WINNT 0x0501
#define WIN32_LEAN_AND_MEAN
#include <Windows.H>
#include <Time.H>
#include <WChar.H>
#define LOOP while ( 1 )
#define Loop( N ) int J = - 1 , LLL = N ; while ( ++ J < LLL )
#define While( Should_Loop ) Ch = 1 , P -- ; \
while ( \
Ch && ( Ch = * ++ P , Ch2 = ! Ch ? 0 : P [ 1 ] , Should_Loop ) )
#define WhileBlack While ( Ch && Ch > 32 )
#define WhileWhite While ( Ch && Ch <= 32 )
#define WhiteSP ( Ch && ( Ch <= 32 || Ch == L',' || Ch == L'!' \
|| Ch == L':' || Ch == L'@' || Ch == L';' || Ch == L'<' \
|| Ch == L'>' || Ch == L'(' || Ch == L')' || Ch == L'"' \
|| Ch == L'\'' ) )
#define Next_Word { While ( ! WhiteSP ); While ( WhiteSP ); }
#define AtoI _wtof
#define Eq ! wcscmp
#define EqN ! wcsncmp
#define Str swprintf
#define Cat_Str wcscat
#define SecsToDate _wasctime
#define StrLen wcslen
#pragma warning( disable: \
4189 4244 4305 4430 4508 4554 4701 4702 4706 4709 4996 )
typedef unsigned __int64 u64 ; typedef wchar_t * LnP ;
inline int er ( int X , int Y ) { return X < Y ? X : Y ; }
inline u64 er ( u64 X , u64 Y ) { return X < Y ? X : Y ; }
inline float er ( float X , float Y ) { return X < Y ? X : Y ; }
inline int ER ( int X , int Y ) { return X > Y ? X : Y ; }
inline u64 ER ( u64 X , u64 Y ) { return X > Y ? X : Y ; }
inline float ER ( float X , float Y ) { return X > Y ? X : Y ; }
inline int IsDigit( wchar_t Ch ) { return Ch >= '0' && Ch <= '9' ; }
// DateFmt() Sets Date_Now, in seconds since start of 1970.
// Sets Date_Born
#define Calc_Age_Days \
ER( u64( 0 ), Date_Now - Date_Born ) / _24_60_60
u64 Date_Born, Date_Now ;
LnP Month ; int Sec , Min , Hour , PM , Day , Year ;
const int _60_60 = 60 * 60 ; const float _24_60_60 = 24 * _60_60 ;
LnP DateFmt ( LnP P ) { LnP B = P ;
struct tm _TimeRec = { 0, -1 }, * TimeRec = & _TimeRec ;
Date_Born = Date_Now = time( 0 );
if ( ! P || ! * P ) TimeRec = localtime( ( time_t * ) & Date_Now );
else { int Ch, Ch2 ; WhileWhite;
if ( ! IsDigit ( Ch ) ) Next_Word TimeRec->tm_mday = AtoI ( P );
Next_Word LnP _Mo = P ; Next_Word
TimeRec->tm_year = AtoI ( P ) + ( P [ 2 ] <= 32 ? 100 : - 1900 );
Next_Word
const LnP Mos [] = {
L"Jan", L"Feb", L"Mar", L"Apr", L"May", L"Jun"
, L"Jul", L"Aug", L"Sep", L"Oct", L"Nov", L"Dec" };
Loop ( 12 ) if ( EqN ( _Mo, Mos [ J ], 3 ) ) break ;
TimeRec->tm_mon = J ;
Hour = AtoI ( P ); Next_Word Min = AtoI ( P ); Next_Word
TimeRec->tm_sec = AtoI ( P ); Next_Word
float Zf = 0 ;
if ( ! Eq( P, L"GMT" ) && ! Eq( P, L"UTC" ) )
Zf = AtoI ( P ) / 100. ;
int Z = Zf , Z_Min = 100 * ( Zf - Z );
TimeRec->tm_min = Min -= Z_Min ;
TimeRec->tm_hour
= Hour -= Z + ( _timezone / _60_60 - TimeRec->tm_isdst );
Date_Born = er( Date_Now , mktime( TimeRec ) ); }
LnP T = SecsToDate( TimeRec );
Year = AtoI ( T + 20 ); Month = T + 4 , Month[ 3 ] = 0 ;
Day = AtoI ( T + 8 ); Hour = AtoI ( T + 11 );
PM = Hour >= 12 ; if ( PM ) Hour -= 12 ;
Min = AtoI( T + 14 ); Sec = AtoI( T + 17 );
wchar_t sH[ 4 ] , sM[ 4 ] , Time_o_Day[ 44 ];
Str( sH, L"%d", Hour );
Str( sM, L"%s%d", Min <= 9 ? L"_" : L"", Min );
Str ( Time_o_Day, L"%s.%s %c"
, ! Hour ? L"_" : sH , ! Min ? L"__" : sM , PM ? 'P': 'A' );
static wchar_t Brv [ 88 ];
Str( Brv , L"%s %d, %d, %s" , Month , Day , Year , Time_o_Day );
return Brv ; }
LnP Prn( float X ) { static int I ; static wchar_t B_[ 9 ][ 44 ];
LnP B = B_[ I ++ , I %= 9 ];
int Kilo = X >= 1000. ; if ( Kilo ) X /= 1000. ;
int Milli = X >= .001 && X < 1. ; if ( Milli ) X *= 1000. ;
Str( B, L"%.3f", X ); if ( * B == '0' ) B ++ ;
LnP P = B ; int Ch, Ch2 ; int FromLeft = 0, Found_Dot = 0 ;
While( FromLeft < 3 || ! Found_Dot ) { int Dot = Ch == '.' ;
Found_Dot |= Dot ; if ( ! Dot ) FromLeft ++ ; }
while ( -- P > B && P[ 1 ] != '.' && ( * P == '.' || * P == '0' ) );
if ( * ++ P == '.' && P - B > 3 ) { LnP C = P - 3 ;
wmemmove( C + 1 , C , 3 ), * C = ',', P ++ ; }
* P = 0 ; if ( P == B + 1 && * B == '.' ) * B = 0 ;
if ( Kilo ) Cat_Str( B , L" Kilo" );
if ( Milli ) Cat_Str( B , L" Milli" ); return B ; }
LnP Ago( float Days ) { static int I ; static wchar_t B_[ 4 ][ 44 ];
LnP B = B_[ I ++ , I %= 4 ];
float Years = Days / 365
, Months = Days / 30.5 , Hours = Days * 24 , Minutes = Hours * 60 ;
if ( Years >= 1 ) {
Str( B , L"%s Years" , Prn( Years ) ); return B ; }
if ( Months >= 1 ) {
Str( B , L"%s Months" , Prn( Months ) ); return B ; }
if ( Days >= 1 ) {
Str( B , L"%s Days" , Prn( Days ) ); return B ; }
if ( Hours >= 1 ) {
Str( B , L"%s Hours" , Prn( Hours ) ); return B ; }
if ( Minutes >= 1 ) {
Str( B , L"%d Minutes" , int( Minutes ) ); return B ; }
Str( B , L"%d Seconds" , int( Minutes * 60 ) ); return B ; }
wchar_t A_63 [ 'z' + 1 ], _63_A [ 64 ];
LnP u64_To_B62 ( u64 N, int Digits ) { const int Max_B62 = 11 ;
static wchar_t Uni [ Max_B62 + 1 ];
LnP Left = Uni + Max_B62 ; * Left = 0 ;
Loop ( ! Digits ? Max_B62 : Digits ) {
if ( ! Digits && J && ! N ) break ;
int K = N % 62 ; N /= 62 ; * -- Left = _63_A [ K ]; }
return Left ; }
int __stdcall WinMain( HINSTANCE, HINSTANCE, char*, int ) {
{ LnP CC = L"Aa0+/"; int X = -1 ;
Loop( StrLen ( CC ) ) {
int L = J > 2 ? 1 : J == 2 ? 10 : 26 ; wchar_t C = CC [ J ] - 1 ;
Loop( L ) A_63 [ _63_A [ X ] = ++ C ] = ++ X ; } }
// The seconds since 1970 get place in: ??? Date_Born ???.
wchar_t Output[ 88 ];
DateFmt( L"24 Aug 2007 01:25:20 GMT" );
Str( Output, L"Posted %s ago.", Ago( Calc_Age_Days ) );
// Output[] now contains: ??? Posted 1 Days ago. ???.
Str( Output, L"Stored as %s.", u64_To_B62 ( Date_Born , 0 ) );
// Output[] now contains: ??? Stored as BSYX5W. ???.
// LnP FileName = L"Print.RES";
// HANDLE fp = CreateFile( FileName, 0,0,0, OPEN_EXISTING, 0,0 );
// GetFileTime( fp, 0, 0, ( FILETIME * ) & Date_Born );
// Date_Born = ( Date_Born - 116444736000000000 ) / 10000000 ;
// Str( Output
// , L"%s was last modified %s ago.", FileName, Ago( Calc_Age_Days ) );
// Output[] now contains:
// ??? Print.RES was last modified 10 Years ago. ???.
}