วันที่ของ Excel เพื่อประทับเวลา Unix


85

ไม่มีใครรู้วิธีแปลงวันที่ของ Excel เป็นเวลาประทับ Unix ที่ถูกต้อง?


"วันที่ excel" หมายความว่าอย่างไร คุณหมายถึงข้อความที่จัดรูปแบบเป็นสตริงวันที่ - เวลาที่มนุษย์อ่านได้เช่น"11/09/2009 3:23:24 PM"?
Matt Ball

4
อย่าลืมว่าในวันที่ 19 มกราคม 2038 Unix Time Stamp จะหยุดทำงานเนื่องจากการล้น 32 บิต ก่อนช่วงเวลานี้แอปพลิเคชันหลายล้านแอปพลิเคชันจะต้องใช้แบบแผนใหม่สำหรับการประทับเวลาหรือย้ายไปใช้ระบบ 64 บิตซึ่งจะซื้อการประทับเวลาเพิ่มอีก "บิต"

13
เช่น 32 บิตมากขึ้นเวลา
user606723

คำตอบ:


107

สิ่งเหล่านี้ไม่ได้ผลสำหรับฉัน ... เมื่อฉันแปลงการประทับเวลากลับเป็นเวลา 4 ปี

สิ่งนี้ทำงานได้อย่างสมบูรณ์แบบ: =(A2-DATE(1970,1,1))*86400

เครดิตไปที่: Filip Czaja http://fczaja.blogspot.ca

โพสต์ต้นฉบับ: http://fczaja.blogspot.ca/2011/06/convert-excel-date-into-timestamp.html


6
อย่าลืมเขตเวลาของคุณ (เว้นแต่คุณจะอยู่ใน UTC และไม่สังเกตเวลาฤดูร้อน) UNIX epoch ไม่เชื่อเรื่องพระเจ้าในเขตเวลาในขณะที่สเปรดชีตไม่ใช่ นี่คือคำแนะนำพร้อมตัวอย่าง
Adam Katz

GMT + 8:=((A1+28800)/86400)+25569
Ivan Chau

เวลาปัจจุบันของ CDT (เวลากลางวันกลาง):=(NOW()-DATE(1970,1,1))*86400 + 5*3600
hBrent

Excel เวอร์ชันใหม่จะบ่นเกี่ยวกับสูตรข้างต้นเว้นแต่คุณจะแทนที่จุลภาคด้วยอัฒภาค:(1970;1;1)
Jose Luis Blanco

1
@tonygil มันจะทำงานถ้าเซลล์ที่คุณกำหนดเป้าหมายเป็นวันที่จริงใน Excel หากเป็นข้อความที่ควรจะแสดงวันที่เดิมพันทั้งหมดจะปิด
Casey

76

Windows และ Mac Excel (2011):

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

MAC OS X (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
ดูเหมือนว่า Office 2011 บน Mac จะทำงานได้ดีกับเวอร์ชัน "Windows" ของสูตรเหล่านี้ เวอร์ชัน "Mac" ปิดตัวลงแล้ว
radicand

1
ฉันคิดว่าคุณได้ย้อนกลับการประทับเวลา excel และ unix ในสูตรเหล่านั้นแล้ว การประทับเวลา Unix เป็นจำนวนวินาทีดังนั้นจึงจำเป็นต้องหารด้วย 86400 แทนที่จะเป็นเวลาประทับของ excel ซึ่งเป็นสิ่งที่สูตรพูด ดูคำตอบของ @ radicand
Mike Houston

ขอบคุณสำหรับความคิดเห็นทดสอบสิ่งนี้บน Mac Excel 2011 และดูเหมือนว่าจะเหมือนกับเวอร์ชัน Windows
Jeff Wu

มีวิธีเปลี่ยน timstamp unix เป็นมิลลิวินาทีเป็นวันที่และเวลาโดยรักษามิลลิวินาทีหรือไม่
Lorenzo Belli

ชายคนนั้นพูดใน stackoverflow ใช่แล้ววินาทีอธิกสุรทินศาสตราจารย์
catamphetamine

11

หากเราถือว่าวันที่ใน Excel อยู่ในเซลล์ A1 ที่จัดรูปแบบเป็นวันที่และการประทับเวลา Unix ควรอยู่ในเซลล์ A2 ที่จัดรูปแบบเป็นตัวเลขสูตรใน A2 ควรเป็น:

= (A1 * 86400) - 2209075200

ที่ไหน:

86400 คือจำนวนวินาทีในวันที่ 2209075200 คือจำนวนวินาทีระหว่าง 1900-01-01 และ 1970-01-01 ซึ่งเป็นวันที่ฐานสำหรับการประทับเวลาของ Excel และ Unix

ข้างต้นเป็นจริงสำหรับ Windows บน Mac วันที่ฐานใน Excel คือ 1904-01-01 และควรแก้ไขตัวเลขวินาทีเป็น 2082844800


มันใช้งานไม่ได้กับ windows อย่างน้อย ปิดโดย 19 ชั่วโมง
LLBBL

4
จึงควรเป็นดังนี้ = (A1 * 86400) - 2209143600
LLBBL

2
ฐานวันที่เริ่มต้นของ Mac Excel คือ 1904 ในขณะที่ใน Windows Excel เป็นปี 1900 แต่คุณสามารถเปลี่ยนฐานวันที่ใน Mac Excel ได้โดยยกเลิกการเลือก "use 1904 date system" ภายใต้การตั้งค่า / การคำนวณจากนั้นจะทำงานเหมือน windows excel
Cloudranger

7

นี่คือการทำแผนที่สำหรับการอ้างอิงโดยสมมติว่าUTCสำหรับระบบสเปรดชีตเช่น Microsoft Excel:

                         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

*   “ Jan Zero, 1900” คือ 1899/12/31; ดูส่วนข้อบกพร่องด้านล่าง Excel 2011 สำหรับ Mac (และเก่า) ใช้ระบบวัน 1904

 

ขณะที่ผมมักจะใช้awkในการประมวลผลCSVและเนื้อหาคั่นด้วยช่องว่างผมพัฒนาวิธีการแปลงยูนิกซ์ยุคไปยังเขต / DST -appropriateรูปแบบวันที่ Excel:

ฉันใช้echoสำหรับตัวอย่างนี้ แต่คุณสามารถไพพ์ไฟล์โดยที่คอลัมน์แรก (สำหรับเซลล์แรกในรูปแบบ. csv เรียกมันว่าawk -F,) เป็นยุค UNIX แก้ไข$1เพื่อแสดงจำนวนคอลัมน์ / เซลล์ที่คุณต้องการหรือใช้ตัวแปรแทน

dateนี้จะทำให้การเรียกระบบการ หากคุณมีเวอร์ชัน GNU ที่เชื่อถือได้คุณสามารถลบ2>/dev/null || date … +%%zและข้อที่สอง, $1ออกได้ เนื่องจาก GNU ทั่วไปเป็นอย่างไรฉันไม่แนะนำให้สมมติว่าเป็นเวอร์ชันของ BSD

getlineอ่านโซนเวลาชดเชยออกมาโดยdate +%zเข้าไปซึ่งเป็นที่แปลแล้วเป็นtz hoursรูปแบบจะเป็นเหมือน-0700( PDT ) หรือ+0530( IST ) ดังนั้นสตริงย่อยแรกที่แยกออกมาคือ07หรือ05อันที่สองคือ00หรือ30(จากนั้นหารด้วย 60 เพื่อแสดงเป็นชั่วโมง) และการใช้ครั้งที่สามเพื่อtzดูว่าออฟเซ็ตของเราเป็นลบหรือไม่และเปลี่ยนแปลงhoursหากมีความจำเป็น.

สูตรที่ได้รับในทุกคำตอบอื่น ๆ ในหน้านี้จะใช้ในการตั้งค่าด้วยนอกเหนือจากการปรับโซนเวลากลางวันประหยัดทราบเป็นexcelhours/24

หากคุณใช้ Excel for Mac เวอร์ชันเก่าคุณจะต้องใช้24107แทน25569(ดูการทำแผนที่ด้านบน)

ในการแปลงเวลาที่ไม่ใช่ยุคโดยพลการเป็นเวลาที่เหมาะกับ Excel ด้วยวันที่ GNU:

นี่เป็นรหัสเดียวกันโดยทั่วไป แต่date -dไม่มีการ@แสดงถึงยุคยูนิกซ์อีกต่อไป (เนื่องจากตัวแยกวิเคราะห์สตริงมีความสามารถเพียงใดฉันรู้สึกประหลาดใจจริง ๆ ที่@จำเป็นต้องมีรูปแบบวันที่อื่นใดที่มีตัวเลข 9-10 หลัก) และตอนนี้ก็ถาม สำหรับสองเอาต์พุต: ยุคและเขตเวลาชดเชย คุณสามารถใช้เช่น@1234567890เป็นอินพุตได้

บั๊ก

Lotus 1-2-3 (ซอฟต์แวร์สเปรดชีตดั้งเดิม) โดยเจตนาถือว่า 1900 เป็นปีอธิกสุรทินแม้ว่าจะไม่เป็นเช่นนั้นก็ตาม (ซึ่งจะลด codebase ลงในแต่ละครั้งเมื่อนับทุกไบต์) Microsoft Excel ยังคงรักษาจุดบกพร่องนี้ไว้เพื่อความเข้ากันได้โดยข้ามวันที่ 60 (สมมติว่า 1900/02/29) โดยคงการทำแผนที่ของ Lotus 1-2-3 ในวันที่ 59 ถึง 1900/02/28 LibreOffice แทนกำหนดวันที่ 60 เป็น 1900/02/28 และดันวันก่อนหน้าทั้งหมดกลับเป็นวันเดียว

วันใดก็ได้ก่อน 1900/03/01 อาจมากถึงวันหยุด:

Excel ไม่ยอมรับวันที่ติดลบและมีคำจำกัดความพิเศษของ Zeroth ของเดือนมกราคม (1899/12/31) สำหรับศูนย์วัน ภายใน Excel จะจัดการวันที่ติดลบอย่างแท้จริง (เป็นเพียงตัวเลขเท่านั้น) แต่จะแสดงเป็นตัวเลขเนื่องจากไม่ทราบวิธีแสดงเป็นวันที่ (และไม่สามารถแปลงวันที่เก่ากว่าเป็นจำนวนลบได้) 29 ก.พ. 2443 วันที่ไม่เคยเกิดขึ้นได้รับการยอมรับจาก Excel แต่ไม่ใช่ LibreOffice


4

เนื่องจากการแก้ไขด้านบนของฉันถูกปฏิเสธ (มีใครลองทำจริงหรือไม่) นี่คือสิ่งที่คุณต้องการเพื่อให้ได้ผล:

Windows (และ Mac Office 2011+):

  • Unix Timestamp = (Excel Timestamp - 25569) * 86400
  • การประทับเวลาของ Excel = (Unix Timestamp / 86400) + 25569

MAC OS X (ก่อน Office 2011):

  • Unix Timestamp = (Excel Timestamp - 24107) * 86400
  • การประทับเวลาของ Excel = (Unix Timestamp / 86400) + 24107

2

เห็นได้ชัดว่าคุณหยุดงานภายในวันเดียวคือ 86400 วินาที ใช้หมายเลข 2209161600 ไม่ใช่หมายเลข 2209075200 หากคุณ Google ใช้หมายเลขสองหมายเลขนี้คุณจะพบการสนับสนุนด้านบน ฉันลองใช้สูตรของคุณแล้ว แต่มักจะแตกต่างจากเซิร์ฟเวอร์ของฉัน 1 วัน ไม่ชัดเจนจากการประทับเวลาของ unix เว้นแต่คุณจะคิดเป็น unix แทนเวลาของมนุษย์ ;-) แต่ถ้าคุณตรวจสอบอีกครั้งคุณจะเห็นว่าสิ่งนี้อาจถูกต้อง


ถูกต้องเนื่องจาก Excel คำนวณปีแรกเป็นปีอธิกสุรทินแม้ว่าจะไม่ใช่
ANisus

ฉันสามารถยืนยันได้ว่าเลขวิเศษคือ 2209161600 ซึ่งเป็น 1970-01-01 - 1900-01-01 + 1 วัน * 86400 หากคุณป้อน 1900-01-01 ใน excel และบันทึกเป็นรูปแบบ sylk และดูไฟล์ใน โปรแกรมแก้ไขข้อความคุณจะเห็นว่ามันบันทึกวันที่นั้นเป็น 1 แทนที่จะเป็นศูนย์เท่าที่ควรซึ่งเป็นสาเหตุที่คุณต้องเพิ่ม 1 วัน
Cloudranger

1

ฉันมีฐานข้อมูล Excel เก่าที่มีวันที่ "มนุษย์อ่านได้" เช่น2010.03.28 20:12:30 วันที่ Theese อยู่ใน UTC + 1 (CET) และจำเป็นต้องแปลงเป็นเวลาตามยุคสมัย

ฉันใช้สูตร= (A4-DATE (1970; 1; 1)) * 86400-3600เพื่อแปลงวันที่เป็นช่วงเวลาจากคอลัมน์ A เป็นค่าคอลัมน์ B ตรวจสอบการชดเชยเขตเวลาของคุณและคำนวณด้วยคณิตศาสตร์ 1 ชั่วโมงคือ 3600 วินาที

สิ่งเดียวที่ฉันเขียน anwser ที่นี่คุณจะเห็นว่าหัวข้อนี้มีอายุมากกว่า 5 ปีคือฉันใช้ Excel เวอร์ชันใหม่และโพสต์สีแดงในหัวข้อนี้ด้วย แต่ไม่ถูกต้อง วันที่ (1970; 1; 1) ในปี 1970 และเดือนมกราคมจะต้องแยกจากกัน และไม่ใช่ด้วย

หากคุณกำลังประสบปัญหานี้หวังว่าจะช่วยคุณได้ ขอให้เป็นวันที่ดี :)


0

ไม่มีคำตอบใดที่ใช้ได้กับฉันเนื่องจากข้อมูลของฉันอยู่ในรูปแบบนี้จากด้าน unix:

2016-02-02 19:21:42 UTC

ฉันต้องการแปลงสิ่งนี้เป็น Epoch เพื่อให้สามารถอ้างอิงข้อมูลอื่น ๆ ที่มีการประทับเวลายุค

  1. สร้างคอลัมน์ใหม่สำหรับส่วนวันที่และแยกวิเคราะห์ด้วยสูตรนี้

    =DATEVALUE(MID(A2,6,2) & "/" & MID(A2,9,2) & "/" & MID(A2,1,4)) 
    
  2. ตามที่ Grendler อื่น ๆ ได้ระบุไว้ที่นี่แล้วให้สร้างคอลัมน์อื่น

    =(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"] อยู่ระหว่างวันอาทิตย์สุดท้ายของเดือนมีนาคมถึงวันอาทิตย์สุดท้ายของเดือนตุลาคม [บรรทัดรหัสที่สามและสี่] ฉันจะลบหนึ่งชั่วโมง [-TIME (1; 0; 0)] ถึงวันที่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.