google v8 Date 以double 类型储存从1970开始的毫秒数。
FILETIME 储存从1601年开始的 (100纳秒)数
1 void v8date_to_systemtime(v8::Handle<Value> dateVal,LPSYSTEMTIME st) 2 { 3 Local<Date> d = Date::Cast(*dateVal); 4 __int64 nTime = (__int64)d->NumberValue(); 5 nTime *= 10000;// 先转换为100微秒单位的FILETIME 6 nTime += 116444736000000000;// FILETIME是1601年开始的,需要和1970年进行转换 7 ::FileTimeToSystemTime((LPFILETIME)&nTime, st); 8 } 9 v8::Handle<Value> systemtime_to_v8date(LPSYSTEMTIME st) 10 { 11 __int64 nTime; 12 ::SystemTimeToFileTime(st, (LPFILETIME)&nTime); 13 nTime -= 116444736000000000; 14 nTime /= 10000; 15 return v8::Date::New((double)nTime); 16 }
补充:
通过FILETIME来转换为本地时间
1 void v8date_to_localtime(v8::Handle<Value> dateVal,LPSYSTEMTIME localTime) 2 { 3 // SYSTEMTIME st; 4 // v8date_to_systemtime(dateVal,&st); 5 // TIME_ZONE_INFORMATION zinfo; 6 // GetTimeZoneInformation(&zinfo); 7 // SystemTimeToTzSpecificLocalTime(&zinfo,&st, localTime); 8 Local<Date> d = Date::Cast(*dateVal); 9 __int64 nTime = (__int64)d->NumberValue(); 10 nTime *= 10000;// 先转换为100微秒单位的FILETIME 11 nTime += 116444736000000000;// FILETIME是1601年开始的,需要和1970年进行转换 12 FILETIME ft; 13 FileTimeToLocalFileTime((LPFILETIME)&nTime,&ft); 14 ::FileTimeToSystemTime(&ft, localTime); 15 } 16 17 v8::Handle<Value> localtime_to_v8date(LPSYSTEMTIME st) 18 { 19 __int64 nTime; 20 FILETIME ft; 21 ::SystemTimeToFileTime(st,&ft); 22 LocalFileTimeToFileTime(&ft,(LPFILETIME)&nTime); 23 nTime -= 116444736000000000; 24 nTime /= 10000; 25 return v8::Date::New((double)nTime); 26 }