2013-12-08 3 views
18

मैं Google क्रोम के लिए ब्राउज़िंग इतिहास वाले डेटाबेस से जानकारी पढ़ने के लिए SQLite डेटाबेस ब्राउज़र का उपयोग कर रहा हूं। मेरे वर्तमान कोड है कि मैं "निष्पादित एसक्यूएल" पैनल में क्रियान्वित कर रहा हूँ इस तरह दिखता है:क्रोम के टाइमस्टैम्प का प्रारूप क्या है?

SELECT last_visit_time,url,title 
FROM urls 
WHERE url LIKE {PLACEHOLDER} AND title LIKE {PLACEHOLDER} 

"कहाँ" लाइन पर सामान गोपनीयता प्रयोजनों के लिए {PLACEHOLDER} के साथ बाहर अवरुद्ध है। अब, मैं इसे ऐसा बनाना चाहता हूं कि last_visit_time कॉलम में लौटा गया डेटा 13029358986442901 जैसे जुम्बल गड़बड़ के बजाय पठनीय है। मैं यह कैसे कर सकता हूं और मैं क्रोम के टाइमस्टैम्प को एक पठनीय प्रारूप में कैसे परिवर्तित करूं? last_visit_time द्वारा उन्हें (लौटाई गई पंक्तियों) को ऑर्डर करने के लिए मैं इसे कैसे प्राप्त करूं?

उत्तर

27

जवाब this question में दी गई है: "[गूगल क्रोम के] टाइमस्टैम्प जनवरी के बाद से माइक्रोसेकंड की संख्या की तरह स्वरूपित 1601"

तो मेरी नमूना इतिहास डेटाबेस, क्वेरी

SELECT 
    datetime(visit_time/1000000 + (strftime('%s', '1601-01-01')), 'unixepoch') 
FROM visits 
ORDER BY visit_time DESC 
LIMIT 10; 
में उदाहरण के लिए 13029358986442901 के अपने टाइमस्टैम्प मान का उपयोग

2014-09-29 14:22:59 
2014-09-29 14:21:57 
2014-09-29 14:21:53 
2014-09-29 14:21:50 
2014-09-29 14:21:32 
2014-09-29 14:21:31 
2014-09-29 14:16:32 
2014-09-29 14:16:29 
2014-09-29 14:15:05 
2014-09-29 14:15:05 

:

परिणाम देता है

SELECT 
    datetime(13029358986442901/1000000 + (strftime('%s', '1601-01-01')), 'unixepoch') 

परिणाम है:

2013-11-19 18:23:06 
+0

टाइमज़ोन को संभालने के लिए समायोजित क्वेरी: 'डेटाटाइम (last_visit_time/1000000 + (स्ट्रेटटाइम ('% s', '1601-01-01T05: 30: 00')), 'यूनिक्सपोक') 'जहां' टी05: 30: 00 मेरा टाइमज़ोन है। इसे अपने साथ बदलें। – matrix

1

मैं इतना कोडिंग मुझे यकीन है कि आप इसे कैसे एसक्यूएल के साथ क्या नहीं कर रहा हूँ करने के लिए नए कर रहा हूँ, फिर भी मैं तुम्हें सी # में एक विधि दिखा सकते हैं। मुझे उम्मीद है कि यह किसी की मदद करेगा।

तो डेटाबेस में दिए गए समय मूल्य है:

DateTime dateTimeVar = new DateTime(1601,1,1).AddSeconds(time); 

जवाब यहाँ था:
13029358986442901. का चयन केवल पहले 11 अंक 13029358986. आप का उपयोग कर समय पर इस में बदल सकते हैं 19-11- 2013 18:23:06 और यह आपके समय क्षेत्र रूपांतरण के बिना था।

+0

11 वें के बाद सभी अंकों को कम करने के बजाय आप समय मूल्य को 1,000,000 तक विभाजित कर सकते हैं जो आपको अभी भी एक सटीक सटीक तारीख – Bryida

5

visits.visit_time 1 जनवरी, 1601 यूटीसी के बाद से माइक्रोसेकंड में है जो विंडोज फ़ाइलटाइम के लिए गलत नहीं है, लेकिन 1 जनवरी, 1601 यूटीसी के बाद से 100 नैनोसेकंड की संख्या है।

ट्रिविया: क्यों 1601?
मुझे लगता है कि लोकप्रिय जवाब यह है कि ग्रेगोरियन कैलेंडर 400 साल के चक्र पर चलता है, और 1601 उस चक्र का पहला वर्ष है जो उस समय सक्रिय था जब विंडोज एनटी डिजाइन किया गया था। दूसरे शब्दों में, गणित को अच्छी तरह से बाहर निकालने के लिए चुना गया था। 1 जनवरी, 1601 कोबोल पूर्णांक तिथियों की उत्पत्ति है। यह एएनएसआई दिनांक प्रारूप द्वारा दिन 1 भी है। और यदि आप ISO8601 के अनुसार आगे अनुमान लगाते हैं, जिसमें यह प्रारूप है, आईएसओ 8601 साल 1581 तक काम करता है। 1583 से पहले समय के लिए ग्रेगोरियन कैलेंडर पर आधारित था जिसमें प्रति वर्ष 366 दिन हैं। शायद वे अगले शताब्दी तक बस गए।क्यों 1970:


downloads.start_time 1 जनवरी, 1970 यूटीसी

सामान्य ज्ञान के बाद से सेकंड की संख्या है?
ठीक है, मुझे खुशी है कि आपने पूछा .. यह नहीं था .. मूल रूप से यह 1 जनवरी, 1 9 71 था लेकिन बाद में 1 जनवरी, 1 9 70 को गोल किया गया। 1 जनवरी 1 9 70 को जन्म माना जाता है यूनिक्स।

यह ध्यान देने योग्य है कि फ़ायरफ़ॉक्स 1 जनवरी, 1970 के बाद से माइक्रोसेकंड की संख्या के रूप में समय स्वरूप और प्रारूप के लिए नाम PRTime

ये सब एक आईएसओ 8601 युग प्रारूप में हैं है लायक है।

+0

स्रोत "मूल रूप से 1 जनवरी 1 9 71" के लिए स्रोत देता है? – Pacerier

+0

[यूनिक्स प्रोग्रामर का मैनुअल 1 संस्करण यूनिक्स समय को "00:00:00, जनवरी 1, 1 9 71 से समय के रूप में परिभाषित करता है, जो सेकेंड के साठवां में मापा जाता है"। (Http://stackoverflow.com/q/1090869/ 1922144) – davidcondrey

3

क्रोमस टाइमस्टैप यूनिक्सपोक नहीं है !!

क्रोम का मूल समय 01/01/1601 00:00:00 है। स्थानीय समय की गणना करने के लिए, क्रोम समय को एक मिलियन से विभाजित करके सेकंड में परिवर्तित किया जाना चाहिए, और फिर 01/01/1601 00:00:00 और 01/01/1970 00:00:00 के बीच सेकंड अंतर को घटाया जाना चाहिए । ऐसा करने के दो तरीके हैं, जैसे SQLite स्वयं और यूनिक्स।

SQLite:

sqlite> SELECT strftime('%s', '1601-01-01 00:00:00'); 
-11644473600 

तिथि:

$ date +%s -d 'Jan 1 00:00:00 UTC 1601' 
-11644473600 

ऊपर दोनों आदेशों में, "% s" unixepoch समय प्रतिनिधित्व करता है। आदेश यूनिक्सिपोक समय (1 9 70) और बाद की तारीख (क्रोम टाइम बेस, 1601) के बीच सेकंड की संख्या की गणना करते हैं। ध्यान दें कि सेकंड नकारात्मक हैं। बेशक, ऐसा इसलिए है क्योंकि आपको 1 9 70 से 1601 तक पीछे की ओर गिनना है! इस जानकारी के साथ, हम इस तरह SQLite में क्रोम समय परिवर्तित कर सकते हैं:

sqlite> SELECT datetime((time/1000000)-11644473600, 'unixepoch', 'localtime') AS time FROM table; 

एक अच्छा पढ़ा here है।

संबंधित मुद्दे