दिलचस्प पोस्ट
jQuery के वैध प्लगइन – एक सरल कस्टम नियम बनाने के लिए कैसे? .NET में KeyDown और KeyPress के बीच अंतर क्या है? Codeigniter त्रुटि संदेशों के बजाय रिक्त पृष्ठ प्रदर्शित करता है विभिन्न ब्राउज़रों में जावास्क्रिप्ट में क्लाइंट-साइड पर फ़ाइल सामग्री पढ़ना गिट के साथ एक नई शाखा में सबसे हालिया प्रतिबद्धताएं ले जाएं कैसे एक डिस्क आकार मुखौटा एक numpy सरणी में लागू करने के लिए? क्या एक ही Xcode प्रोजेक्ट में स्विफ्ट, ऑब्जेक्टिव सी, सी और सी ++ फाइलें हो सकती हैं? जावा ईई क्या है? मैं jQuery में पृष्ठभूमि छवि आकार कैसे प्राप्त करूं? दो भावों का मेल करना (अभिव्यक्ति <Func <T, bool >>) संकेतक, स्मार्ट पॉइंटर्स या साझा पॉइंटर? मापदंडों के साथ कमांड को कैसे कार्यान्वित करें? जावास्क्रिप्ट क्या एकल-थ्रेडेड होने की गारंटी है? मूल्य से ऑब्जेक्ट निकालने के लिए ऐरे एक्सटेंशन मेरे खुद के पैकेज के अंदर डेटा योग्य पैकेज का उपयोग करना

यूनिक्स / लिनक्स में विंडोज़ फ़ाइल का समय दूसरे में परिवर्तित करें

मेरे पास एक ट्रेस फाइल है जो कि प्रत्येक फ़ाइल का संचयी प्रारूप में प्रतिनिधित्व करता है। ये समय संख्याएं ऐसा कुछ है:

  • 128166372003061629
  • 128166372016382155
  • 128166372026382245

क्या आप कृपया मुझे बताएंगे कि क्या यूनिक्स / लिनक्स में कोई सी / सी + लाइब्रेरी है, जो इन नंबरों से वास्तविक समय (विशेष रूप से दूसरे) को निकालने के लिए है? क्या मैं अपना निष्कर्षण समारोह लिख सकता हूँ?

वेब के समाधान से एकत्रित समाधान "यूनिक्स / लिनक्स में विंडोज़ फ़ाइल का समय दूसरे में परिवर्तित करें"

यह काफी सरल है: विंडोज़ युग 1601-01-01 टी 00: 00: 00 जेड शुरू होता है यूनिक्स / लिनक्स युग (1 970-01-01 -000: 00: 00 जेड) से पहले यह 11644473600 सेकेंड है। विंडोज टैक्स 100 नैनोसेकेंड में हैं। इस प्रकार, UNIX युग से सेकंड प्राप्त करने के लिए एक समारोह निम्नानुसार होगा:

#define WINDOWS_TICK 10000000 #define SEC_TO_UNIX_EPOCH 11644473600LL unsigned WindowsTickToUnixSeconds(long long windowsTicks) { return (unsigned)(windowsTicks / WINDOWS_TICK - SEC_TO_UNIX_EPOCH); } 

FILETIME प्रकार 1 जनवरी 1601 के बाद से संख्या 100 एनएस वेतन वृद्धि है।

इसे यूनिक्स टाइम_टी में परिवर्तित करने के लिए आप निम्न का उपयोग कर सकते हैं।

 #define TICKS_PER_SECOND 10000000 #define EPOCH_DIFFERENCE 11644473600LL time_t convertWindowsTimeToUnixTime(long long int input){ long long int temp; temp = input / TICKS_PER_SECOND; //convert from 100ns intervals to seconds; temp = temp - EPOCH_DIFFERENCE; //subtract number of seconds between epochs return (time_t) temp; } 

आप तब सीटीएमटी फ़ंक्शन का इस्तेमाल करके इसे हेरफेर कर सकते हैं

(मुझे पता चला कि मैं एक टिप्पणी में पठनीय कोड दर्ज नहीं कर सकता, इसलिए …)

ध्यान दें कि Windows पॉसिक्स युग के समय के बाहर समय का प्रतिनिधित्व कर सकता है, और इस प्रकार एक रूपांतरण रूटीन को उपयुक्त के रूप में "आउट-ऑफ़-रेंज" संकेत वापस करना चाहिए। सरल तरीका यह है:

  ... (as above) long long secs; time_t t; secs = (windowsTicks / WINDOWS_TICK - SEC_TO_UNIX_EPOCH); t = (time_t) secs; if (secs != (long long) t) // checks for truncation/overflow/underflow return (time_t) -1; // value not representable as a POSIX time return t; 

पुराने प्रश्न के लिए नया उत्तर

सी ++ 11 का <chrono> प्लस यह मुफ्त, ओपन सोर्स लाइब्रेरी का उपयोग करना:

https://github.com/HowardHinnant/date

कोई भी इन टाइमस्टैम्प को std::chrono::system_clock::time_point परिवर्तित कर सकता है, और इन टाइमस्टैम्प को ग्रेगोरीयन कैलेंडर में मानव-पठनीय प्रारूप में कनवर्ट कर सकता है:

 #include "date.h" #include <iostream> std::chrono::system_clock::time_point from_windows_filetime(long long t) { using namespace std::chrono; using namespace date; using wfs = duration<long long, std::ratio<1, 10'000'000>>; return system_clock::time_point{floor<system_clock::duration>(wfs{t} - (sys_days{1970_y/jan/1} - sys_days{1601_y/jan/1}))}; } int main() { using namespace date; std::cout << from_windows_filetime(128166372003061629) << '\n'; std::cout << from_windows_filetime(128166372016382155) << '\n'; std::cout << from_windows_filetime(128166372026382245) << '\n'; } 

मेरे लिए यह आउटपुट:

 2007-02-22 17:00:00.306162 2007-02-22 17:00:01.638215 2007-02-22 17:00:02.638224 

Windows पर, आप वास्तव में floor छोड़ सकते floor , और सटीक के अंतिम दशमलव अंक प्राप्त कर सकते हैं:

  return system_clock::time_point{wfs{t} - (sys_days{1970_y/jan/1} - sys_days{1601_y/jan/1})}; 2007-02-22 17:00:00.3061629 2007-02-22 17:00:01.6382155 2007-02-22 17:00:02.6382245 

अनुकूलन के साथ, उप-अभिव्यक्ति (sys_days{1970_y/jan/1} - sys_days{1601_y/jan/1}) समय-समय पर days{134774} संकलित करने पर अनुवाद करेगा, जो आगे संकलन करेगा जो कि यूनिटों को पूर्ण रूप से संकलित करेगा छद्मता की आवश्यकता है (सेकंड, 100 नैनोसेकेंड, जो कुछ भी)। नीचे की रेखा: यह दोनों बहुत ही पठनीय और बहुत ही कुशल है।

यह मानते हुए कि आप FILETIME संरचना के बारे में पूछ रहे हैं, तो FileTimeToSystemTime जो आप चाहते हैं, आप इसे उत्पादन SYSTEMTIME संरचना से सेकंड प्राप्त कर सकते हैं।

जो विभाजन है और जो जोड़ता है वह डेलाइट बचत के साथ ठीक से काम नहीं करेगा

यहां एक स्निपेट है जो काम करता है, लेकिन यह विंडोज़ के लिए है

 time_t FileTime_to_POSIX(FILETIME ft) { FILETIME localFileTime; FileTimeToLocalFileTime(&ft,&localFileTime); SYSTEMTIME sysTime; FileTimeToSystemTime(&localFileTime,&sysTime); struct tm tmtime = {0}; tmtime.tm_year = sysTime.wYear - 1900; tmtime.tm_mon = sysTime.wMonth - 1; tmtime.tm_mday = sysTime.wDay; tmtime.tm_hour = sysTime.wHour; tmtime.tm_min = sysTime.wMinute; tmtime.tm_sec = sysTime.wSecond; tmtime.tm_wday = 0; tmtime.tm_yday = 0; tmtime.tm_isdst = -1; time_t ret = mktime(&tmtime); return ret; } 

यह अनिवार्य रूप से एक ही समाधान है, इसके अलावा यह एक एलडीएपी से नकारात्मक संख्या को सही ढंग से एनकोड करता है और रूपांतरण से पहले अंतिम 7 अंकों को बंद कर देता है।

  public static int LdapValueAsUnixTimestamp(SearchResult searchResult, string fieldName) { var strValue = LdapValue(searchResult, fieldName); if (strValue == "0") return 0; if (strValue == "9223372036854775807") return -1; return (int)(long.Parse(strValue.Substring(0, strValue.Length - 7)) - 11644473600); } 

यह भी एक शुद्ध C # ian तरीका यह करने के लिए है।

 (Int32)(DateTime.FromFileTimeUtc(129477880901875000).Subtract(new DateTime(1970, 1, 1))).TotalSeconds; 

मेरी तात्कालिक विंडो में दोनों विधियों का परिणाम यहां दिया गया है:

 (Int32)(DateTime.FromFileTimeUtc(long.Parse(strValue)).Subtract(new DateTime(1970, 1, 1))).TotalSeconds; 1303314490 (int)(long.Parse(strValue.Substring(0, strValue.Length - 7)) - 11644473600) 1303314490 DateTime.FromFileTimeUtc(long.Parse(strValue)) {2011-04-20 3:48:10 PM} Date: {2011-04-20 12:00:00 AM} Day: 20 DayOfWeek: Wednesday DayOfYear: 110 Hour: 15 InternalKind: 4611686018427387904 InternalTicks: 634389112901875000 Kind: Utc Millisecond: 187 Minute: 48 Month: 4 Second: 10 Ticks: 634389112901875000 TimeOfDay: {System.TimeSpan} Year: 2011 dateData: 5246075131329262904 

अगर किसी को MySQL में बदलने की आवश्यकता है

 SELECT timestamp, FROM_UNIXTIME(ROUND((((timestamp) / CAST(10000000 AS UNSIGNED INTEGER))) - CAST(11644473600 AS UNSIGNED INTEGER),0)) AS Converted FROM events LIMIT 100