एक्सेल तारीख यूनिक्स टाइमस्टैम्प के लिए


85

क्या कोई जानता है कि एक्सेल तारीख को सही यूनिक्स टाइमस्टैम्प में कैसे बदला जाए?


"एक्सेल डेट" से आपका क्या तात्पर्य है? क्या आपको लगता है कि पाठ को मानव-पठनीय तारीख-समय स्ट्रिंग के रूप में स्वरूपित किया गया है "11/09/2009 3:23:24 PM"?
मैट बॉल

4
मत भूलो कि 19 जनवरी 2038 को यूनिक्स टाइम स्टैम्प 32-बिट अतिप्रवाह के कारण काम करना बंद कर देगा। इस क्षण से पहले लाखों अनुप्रयोगों को या तो समय टिकटों के लिए एक नए सम्मेलन को अपनाने की आवश्यकता होगी या 64-बिट सिस्टम पर माइग्रेट किया जाएगा जो समय स्टाम्प को "बिट" अधिक समय तक खरीद लेंगे।

13
अधिक 32bit अधिक समय की तरह।
user606723

जवाबों:


107

इनमें से गैर ने मेरे लिए काम किया ... जब मैंने टाइमस्टैम्प को वापस बदल दिया तो यह 4 साल का है।

यह पूरी तरह से काम किया: =(A2-DATE(1970,1,1))*86400

श्रेय जाता है: फ़िलिप कज्जा http://fczaja.blogspot.ca

मूल पोस्ट: http://fczaja.blogspot.ca/2011/06/convert-excel-date-into-timatamp.html


6
अपने समय क्षेत्र को न भूलें (जब तक आप यूटीसी में न हों और समर टाइम का अवलोकन न करें)। UNIX युग समय क्षेत्र के लिए अज्ञेय है जबकि स्प्रेडशीट नहीं हैं। यहां उदाहरणों के साथ एक गाइड है
एडम काटज

GMT + 8:=((A1+28800)/86400)+25569
इवान चौ

CDT के लिए वर्तमान समय (केंद्रीय दिन के समय का समय):=(NOW()-DATE(1970,1,1))*86400 + 5*3600
hBrent

एक्सेल के आधुनिक संस्करण उपरोक्त सूत्र की शिकायत करेंगे जब तक कि आप अर्धविराम के साथ अल्पविरामों को प्रतिस्थापित नहीं करते हैं:(1970;1;1)
जोस लुइस ब्लैंको

1
@tonygil यह काम करेगा यदि आप जिन कोशिकाओं को लक्षित कर रहे हैं वे वास्तव में Excel में दिनांक हैं। यदि यह पाठ है जो एक तारीख का प्रतिनिधित्व करने वाला है तो सभी दांव बंद हैं।
केसी

75

विंडोज और मैक एक्सेल (2011):

Unix Timestamp = (Excel Timestamp - 25569) * 86400
Excel Timestamp =  (Unix Timestamp / 86400) + 25569

मैक ओएस एक्स (2007):

Unix Timestamp = (Excel Timestamp - 24107) * 86400
Excel Timestamp =  (Unix Timestamp / 86400) + 24107

सन्दर्भ के लिए:

86400 = Seconds in a day
25569 = Days between 1970/01/01 and 1900/01/01 (min date in Windows Excel)
24107 = Days between 1970/01/01 and 1904/01/02 (min date in Mac Excel 2007)

3
मैक पर कार्यालय 2011 इन सूत्रों के "विंडोज" संस्करण के साथ ठीक काम करता है। इस पर "मैक" संस्करण बंद हैं।
रेडिकैंड

1
मुझे लगता है कि आपने उन सूत्रों में एक्सेल और यूनिक्स टाइमस्टैम्प को उलट दिया है। यूनिक्स टाइमस्टैम्प सेकंड के एक नंबर है, और इसलिए एक्सेल टाइमस्टैम्प के बजाय 86400 से विभाजित करने की आवश्यकता है, जो कि सूत्र कहते हैं। देखिए @ रेडिकैंड का जवाब
माइक ह्यूस्टन

टिप्पणियों के लिए धन्यवाद, मैक एक्सेल 2011 पर इसका परीक्षण किया गया है और ऐसा लगता है कि वे विंडोज संस्करण के समान हैं।
जेफ वू

क्या मिलीसेकंड को संरक्षित करने के लिए मिलीसेकंड में यूनिक्स टाइमस्टैम्प को बदलने का एक तरीका है?
लोरेंजो बेल्ली

stackoverflow पर आदमी कहते हैं। हाँ, क्या छलांग सेकंड के बारे में, प्रोफेसर।
कैटमफेटामाइन

11

अगर हम मान लें कि एक्सेल में तारीख तारीख के रूप में A1 सेल में स्वरूपित है और यूनिक्स टाइमस्टैम्प A2 सेल में फॉर्मेट किया जाना चाहिए, क्योंकि A2 में सूत्र संख्या होनी चाहिए:

= (A1 * 86400) - 2209075200

कहाँ पे:

86400 दिन में सेकंड की संख्या है 2209075200 1900-01-01 और 1970-01-01 के बीच सेकंड की संख्या है जो एक्सेल और यूनिक्स टाइमस्टैम्प के लिए आधार तिथियां हैं।

उपरोक्त विंडोज़ के लिए सच है। मैक पर एक्सेल में आधार तिथि 1904-01-01 है और सेकंड संख्या को सही किया जाना चाहिए: 2082844800


यह कम से कम खिड़कियों पर बिल्कुल काम नहीं करता है। यह 19 घंटे से बंद है।
LLBBL

4
तो यह यह होना चाहिए: = (A1 * 86400) - 2209143600
LLBBL

2
मैक एक्सेल डिफॉल्ट डेट बेस 1904 है जबकि विंडोज एक्सेल में यह 1900 है, लेकिन आप वरीयताओं / गणना के तहत "1904 डेट सिस्टम का उपयोग करें" को अनचेक करके मैक एक्सेल में डेट बेस को बदल सकते हैं, फिर यह विंडोज़ एक्सेल की तरह काम करता है।
16

6

यहाँ संदर्भ के लिए एक मानचित्रण है, Microsoft Excel जैसे स्प्रेडशीट सिस्टम के लिए UTC मानकर :

                         Unix  Excel Mac    Excel    Human Date  Human Time
Excel Epoch       -2209075200      -1462        0    1900/01/00* 00:00:00 (local)
Excel ≤ 2011 Mac† -2082758400          0     1462    1904/12/31  00:00:00 (local)
Unix Epoch                  0      24107    25569    1970/01/01  00:00:00 UTC
Example Below      1234567890      38395.6  39857.6  2009/02/13  23:31:30 UTC
Signed Int Max     2147483648      51886    50424    2038/01/19  03:14:08 UTC

One Second                  1       0.0000115740…             —  00:00:01
One Hour                 3600       0.0416666666…             ―  01:00:00
One Day                 86400          1        1             ―  24:00:00

*   "जन शून्य, 1900" 1899/12/31 है; देख बग अनुभाग देखें। 190 एक्सेल 2011 मैक (और पुराने) के लिए 1904 तारीख प्रणाली का उपयोग करें ।

 

जैसा कि मैं अक्सर सीएसवी और अंतरिक्ष-सीमांकित सामग्री awkको संसाधित करने के लिए उपयोग करता हूं, मैंने UNIX युग को समय-क्षेत्र / डीएसटी- अनुपयुक्त एक्सेल तिथि प्रारूप में बदलने का एक तरीका विकसित किया है :

echo 1234567890 |awk '{ 
  # tries GNU date, tries BSD date on failure
  cmd = sprintf("date -d@%d +%%z 2>/dev/null || date -jf %%s %d +%%z", $1, $1)
  cmd |getline tz                                # read in time-specific offset
  hours = substr(tz, 2, 2) + substr(tz, 4) / 60  # hours + minutes (hi, India)
  if (tz ~ /^-/) hours *= -1                     # offset direction (east/west)
  excel = $1/86400 + hours/24 + 25569            # as days, plus offset
  printf "%.9f\n", excel
}'

मैंने echoइस उदाहरण के लिए उपयोग किया है , लेकिन आप एक फ़ाइल को पाइप कर सकते हैं जहां पहला कॉलम (पहली सेल में .csv प्रारूप में, इसे कॉल करें awk -F,) एक UNIX युग है। ऑल्टर $1अपने वांछित स्तंभ / सेल नंबर का प्रतिनिधित्व करते हैं या इसके बजाय एक चर का उपयोग करने के लिए।

यह एक सिस्टम कॉल करता है date। यदि आपके पास जीएनयू संस्करण है, तो आप 2>/dev/null || date … +%%zदूसरी और दूसरी को हटा सकते हैं , $1। जीएनयू कितना आम है, यह देखते हुए मैं बीएसडी के संस्करण की सिफारिश नहीं करूंगा।

getlineसमय क्षेत्र ऑफसेट द्वारा outputted पढ़ता date +%zमें tzहै, जो तब में अनुवादित किया गया hours। प्रारूप -0700( पीडीटी ) या +0530( आईएसटी ) की तरह होगा, इसलिए निकाला गया पहला विकल्प है 07या 05, दूसरा है ( 00या 30फिर 60 से घंटे में विभाजित किया जाना है), और तीसरा उपयोग यह tzदेखता है कि क्या हमारी ऑफसेट नकारात्मक है और बदल जाती है hoursअगर जरुरत हो।

इस पृष्ठ पर अन्य सभी उत्तरों में दिए गए सूत्र को सेट करने के लिए उपयोग किया जाता है excel, दिन के उजाले-बचत-जागरूक समय क्षेत्र समायोजन के अतिरिक्त hours/24

यदि आप मैक के लिए एक्सेल के पुराने संस्करण पर हैं, तो आपको इसके 24107स्थान पर उपयोग करना होगा 25569(ऊपर मानचित्रण देखें)।

GNU दिनांक के साथ किसी भी मनमाने ढंग से गैर-युगांतर को Excel के अनुकूल समय में परिवर्तित करना:

echo "last thursday" |awk '{ 
  cmd = sprintf("date -d \"%s\" +\"%%s %%z\"", $0)
  cmd |getline
  hours = substr($2, 2, 2) + substr($2, 4) / 60
  if ($2 ~ /^-/) hours *= -1
  excel = $1/86400 + hours/24 + 25569
  printf "%.9f\n", excel
}'

यह मूल रूप से एक ही कोड है, लेकिन date -dअब @यूनिक्स युग का प्रतिनिधित्व करने के लिए एक नहीं है (यह देखते हुए कि स्ट्रिंग पार्सर कितना सक्षम है, मुझे वास्तव में आश्चर्य है कि @यह अनिवार्य है; अन्य तिथि प्रारूप में 9-10 अंक क्या हैं?) और अब यह पूछा गया है के लिए दो outputs: युग और समय क्षेत्र ऑफसेट। इसलिए आप उदाहरण @1234567890के लिए इनपुट के रूप में उपयोग कर सकते हैं ।

बग

लोटस 1-2-3 (मूल स्प्रेडशीट सॉफ़्टवेयर) ने जानबूझकर 1900 को इस तथ्य के बावजूद एक लीप वर्ष के रूप में माना था कि यह नहीं था (यह उस समय कोडबेस को कम कर दिया था जब प्रत्येक बाइट की गिनती की गई थी)। माइक्रोसॉफ्ट एक्सेल ने संगतता के लिए इस बग को बनाए रखा , दिन 60 (काल्पनिक 1900/02/29) को लंघन, लोटस 1-2-3 की मैपिंग 59 से 1900/02/28 तक बनाए रखी। LibreOffice के बजाय दिन 60 से 1900/02/28 को सौंपा गया और पिछले सभी दिनों को पीछे धकेल दिया।

1900/03/01 से पहले की कोई भी तारीख एक दिन की हो सकती है:

Day        Excel   LibreOffice
-1            -1    1899/12/29
 0    1900/01/00*   1899/12/30
 1    1900/01/01    1899/12/31
 2    1900/01/02    1900/01/0159    1900/02/28    1900/02/27
60    1900/02/29(!) 1900/02/28
61    1900/03/01    1900/03/01

एक्सेल नकारात्मक तारीखों को स्वीकार नहीं करता है और दिन शून्य के लिए जनवरी (1899/12/31) के ज़रोथ की एक विशेष परिभाषा है। आंतरिक रूप से, एक्सेल वास्तव में नकारात्मक तिथियों को संभालता है (वे सभी के बाद बस नंबर हैं), लेकिन यह उन्हें संख्याओं के रूप में प्रदर्शित करता है क्योंकि यह नहीं जानता कि उन्हें तिथियों के रूप में कैसे प्रदर्शित किया जाए (न ही यह पुरानी तारीखों को नकारात्मक संख्याओं में बदल सकता है)। 29 फरवरी 1900, एक दिन जो कभी नहीं हुआ, उसे एक्सेल द्वारा मान्यता प्राप्त है लेकिन लिबरऑफिस से नहीं।


3

क्योंकि ऊपर दिए गए मेरे संपादन अस्वीकार कर दिए गए थे (क्या आपमें से किसी ने वास्तव में कोशिश की है?), यहां आपको वास्तव में इस काम को करने की आवश्यकता है:

विंडोज (और मैक ऑफिस 2011+):

  • यूनिक्स टाइमस्टैम्प = (Excel Timestamp - 25569) * 86400
  • एक्सेल टाइमस्टैम्प = (Unix Timestamp / 86400) + 25569

मैक ओएस एक्स (प्री ऑफिस 2011):

  • यूनिक्स टाइमस्टैम्प = (Excel Timestamp - 24107) * 86400
  • एक्सेल टाइमस्टैम्प = (Unix Timestamp / 86400) + 24107

2

आप जाहिरा तौर पर एक दिन से दूर हैं, बिल्कुल 86400 सेकंड। संख्या 2209161600 का उपयोग करें। संख्या 2209075200 यदि आप दो नंबरों को Google करते हैं, तो आपको उपरोक्त के लिए समर्थन मिलेगा। मैंने आपका फॉर्मूला आज़माया लेकिन हमेशा अपने सर्वर से 1 दिन अलग रहा। यह यूनिक्स टाइमस्टैम्प से स्पष्ट नहीं है जब तक कि आप मानव समय के बजाय यूनिक्स में नहीं सोचते;; लेकिन अगर आप दोबारा जांच करते हैं तो आप देखेंगे कि यह सही हो सकता है।


यह सही है, क्योंकि एक्सेल लीप ईयर के रूप में पहले साल की गणना कर रहा है, हालांकि यह नहीं है।
एनिसस

मैं पुष्टि कर सकता हूं कि जादू की संख्या वास्तव में 2209161600 है, यह 1970-01-01 - 1900-01-01 + 1 दिन * 86400 है। यदि आप एक्सेल में 1900-01-01 दर्ज करते हैं और sylk प्रारूप के रूप में सहेजें और फ़ाइल को देखें एक पाठ संपादक आप देखेंगे कि यह उस तारीख को शून्य के बजाय 1 के रूप में बचाता है, यही कारण है कि आपको 1 दिन जोड़ना होगा
Cloudranger

1

मेरे पास "मानव-पठनीय" तिथियों के साथ एक पुराना एक्सेल डेटाबेस था, जैसे 2010.03.28 20:12:30 वे दिनांक UTC + 1 (CET) में थे और इसे युग-युग में परिवर्तित करने की आवश्यकता थी।

मैंने = (A4-DATE (1970; 1; 1; 1)) * 86400-3600 फॉर्मूले का उपयोग करते हुए तारीखों को A कॉलम से B कॉलम मानों में परिवर्तित किया। अपने समयक्षेत्र ऑफसेट की जाँच करें और इसके साथ एक गणित बनाएं। 1 घंटा 3600 सेकंड है।

केवल एक ही चीज़ जो मैं यहाँ लिखता हूँ, एक अन्वेषक, आप देख सकते हैं कि यह विषय 5 साल से अधिक पुराना है, मैं इस विषय में नए एक्सेल संस्करण और लाल पोस्ट का उपयोग करता हूं, लेकिन वे गलत हैं। द डेट (1970; 1; 1)। यहां 1970 और जनवरी को अलग करने की जरूरत है; और नहीं के साथ,

यदि आप भी इस समस्या का सामना कर रहे हैं, तो उम्मीद है कि यह आपकी मदद करेगा। आपका दिन शुभ हो :)


0

मेरे द्वारा काम किए गए वर्तमान उत्तरों में से कोई भी काम नहीं किया गया क्योंकि मेरा डेटा यूनिक्स की ओर से इस प्रारूप में था:

2016-02-02 19:21:42 यूटीसी

मुझे अन्य डेटा को संदर्भित करने की अनुमति देने के लिए इसे एपोक में बदलने की आवश्यकता थी, जिसमें एपोक टाइमस्टैम्प था।

  1. दिनांक भाग के लिए एक नया स्तंभ बनाएँ और इस सूत्र के साथ पार्स करें

    =DATEVALUE(MID(A2,6,2) & "/" & MID(A2,9,2) & "/" & MID(A2,1,4)) 
    
  2. जैसा कि अन्य ग्रेंडलर ने पहले ही यहां बताया है, एक और कॉलम बनाएं

    =(B2-DATE(1970,1,1))*86400 
    
  3. कुल सेकंड पाने के लिए बस एक साथ एक और कॉलम बनाएं:

    =(VALUE(MID(A2,12,2))*60*60+VALUE(MID(A2,15,2))*60+VALUE(MID(A2,18,2)))
    
  4. एक अंतिम कॉलम बनाएँ जो पिछले दो कॉलमों को एक साथ जोड़ता है:

    =C2+D2
    

0

यहाँ मेरा अंतिम उत्तर है।

जाहिरा तौर पर जावास्क्रिप्ट का new Date(year, month, day)निर्माता लीप सेकंड के लिए भी खाता नहीं है।

// Parses an Excel Date ("serial") into a
// corresponding javascript Date in UTC+0 timezone.
//
// Doesn't account for leap seconds.
// Therefore is not 100% correct.
// But will do, I guess, since we're
// not doing rocket science here.
//
// https://www.pcworld.com/article/3063622/software/mastering-excel-date-time-serial-numbers-networkdays-datevalue-and-more.html
// "If you need to calculate dates in your spreadsheets,
//  Excel uses its own unique system, which it calls Serial Numbers".
//
lib.parseExcelDate = function (excelSerialDate) {
  // "Excel serial date" is just
  // the count of days since `01/01/1900`
  // (seems that it may be even fractional).
  //
  // The count of days elapsed
  // since `01/01/1900` (Excel epoch)
  // till `01/01/1970` (Unix epoch).
  // Accounts for leap years
  // (19 of them, yielding 19 extra days).
  const daysBeforeUnixEpoch = 70 * 365 + 19;

  // An hour, approximately, because a minute
  // may be longer than 60 seconds, see "leap seconds".
  const hour = 60 * 60 * 1000;

  // "In the 1900 system, the serial number 1 represents January 1, 1900, 12:00:00 a.m.
  //  while the number 0 represents the fictitious date January 0, 1900".
  // These extra 12 hours are a hack to make things
  // a little bit less weird when rendering parsed dates.
  // E.g. if a date `Jan 1st, 2017` gets parsed as
  // `Jan 1st, 2017, 00:00 UTC` then when displayed in the US
  // it would show up as `Dec 31st, 2016, 19:00 UTC-05` (Austin, Texas).
  // That would be weird for a website user.
  // Therefore this extra 12-hour padding is added
  // to compensate for the most weird cases like this
  // (doesn't solve all of them, but most of them).
  // And if you ask what about -12/+12 border then
  // the answer is people there are already accustomed
  // to the weird time behaviour when their neighbours
  // may have completely different date than they do.
  //
  // `Math.round()` rounds all time fractions
  // smaller than a millisecond (e.g. nanoseconds)
  // but it's unlikely that an Excel serial date
  // is gonna contain even seconds.
  //
  return new Date(Math.round((excelSerialDate - daysBeforeUnixEpoch) * 24 * hour) + 12 * hour);
};

0

दिन के समय की बचत के समय को बनाने के लिए (मार्च के अंतिम रविवार से शुरू होकर अक्टूबर के अंतिम रविवार तक) मुझे निम्नलिखित चीजों का उपयोग करना था:

=IF(
  AND(
    A2>=EOMONTH(DATE(YEAR(A2);3;1);0)-MOD(WEEKDAY(EOMONTH(DATE(YEAR(A2);3;1);0);11);7);
    A2<=EOMONTH(DATE(YEAR(A2);10;1);0)-MOD(WEEKDAY(EOMONTH(DATE(YEAR(A2);10;1);0);11);7)
  );
  (A2-DATE(1970;1;1)-TIME(1;0;0))*24*60*60*1000;
  (A2-DATE(1970;1;1))*24*60*60*1000
)

त्वरित स्पष्टीकरण:

यदि तारीख ["A2"] मार्च के अंतिम रविवार और अक्टूबर के अंतिम रविवार [तीसरी और चौथी कोड लाइनों] के बीच है, तो मैं एक घंटे [-टाइम (1; 0; 0)] को घटाकर तारीख तक ले जाऊंगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.