แปลง UTC Epoch เป็นวันที่ท้องถิ่น


274

ฉันได้ต่อสู้กับสิ่งนี้มานานแล้ว ฉันพยายามแปลงยุคเป็นวัตถุวันที่ กาลส่งถึงฉันใน UTC เมื่อใดก็ตามที่คุณผ่านnew Date()ยุคมันจะถือว่าเป็นยุคท้องถิ่น ฉันพยายามสร้างวัตถุ UTC จากนั้นใช้setTime()เพื่อปรับให้เหมาะกับยุคสมัย แต่วิธีเดียวที่ดูเหมือนว่ามีประโยชน์คือtoUTCString()และสตริงไม่ได้ช่วยฉัน หากฉันส่งสตริงนั้นไปยังวันที่ใหม่ก็ควรสังเกตว่าเป็น UTC แต่ไม่ใช่

new Date( new Date().toUTCString() ).toLocaleString()

ความพยายามครั้งต่อไปของฉันคือพยายามหาความแตกต่างระหว่างยุคปัจจุบันในท้องถิ่นกับยุคปัจจุบัน UTC แต่ฉันก็ไม่สามารถรับมันได้

new Date( new Date().toUTCString() ).getTime() - new Date().getTime()

มันให้ความแตกต่างเพียงเล็กน้อยกับฉันภายใต้ 1,000 ซึ่งเป็นมิลลิวินาที

ข้อเสนอแนะใด ๆ


11
เวลายุคถูกกำหนดให้เป็นมิลลิวินาทีที่ผ่านไปนับตั้งแต่วันที่ 1970 ในเวลา UTC ไม่มีสิ่งเช่นยุคในท้องถิ่น! ไม่แน่ใจว่าฉันเข้าใจปัญหาของคุณ
Chetan Sastry

บางทีเขตเวลาในคอมพิวเตอร์ไม่ถูกต้องนำไปสู่ค่า UTC อื่นหรือไม่
kijin

2
คุณต้องตั้งค่านาฬิกาของคุณเป็นเวลา UTC หากคุณต้องการ 'เห็น' เวลา UTC เมื่อคุณใช้ toLocaleString () เที่ยงคืน UTC คือ 19:00 EST หากคุณใช้ Date ใหม่ (). toString () แทนที่จะเป็น localeString คุณจะได้รับสิ่งที่ชอบ: 'ศุกร์ 7 มกราคม 2011 7:00 น. GMT-0500' ซึ่งรวมถึงออฟเซ็ต
kennebec

คำตอบ:


466

ฉันคิดว่าฉันมีทางออกที่ง่ายกว่า - ตั้งวันที่เริ่มต้นเป็นเวลาและเพิ่มหน่วย UTC สมมติว่าคุณมี UTC ยุคสมัยเก็บไว้ในไม่กี่วินาที 1234567890วิธีการเกี่ยวกับ หากต้องการแปลงให้เป็นวันที่ที่เหมาะสมในโซนเวลาท้องถิ่น:

var utcSeconds = 1234567890;
var d = new Date(0); // The 0 there is the key, which sets the date to the epoch
d.setUTCSeconds(utcSeconds);

d เป็นวันที่ (ในเขตเวลาของฉัน) ตั้งเป็น Fri Feb 13 2009 18:31:30 GMT-0500 (EST)


190
FWIW วัตถุวันที่สามารถเริ่มต้นได้ด้วยมิลลิวินาที ดังนั้นvar d = new Date(utcSeconds * 1000)ควรให้ผลลัพธ์เดียวกัน
kurttheviking

54
var d = new Date(1234567890000)ส่งคืนผลลัพธ์เดียวกัน
Matjaz Lipus

11
คิดว่าคนอื่นอาจได้ความชัดเจนจากจุดสองสาม: วัตถุวันไม่ได้รับการตั้งค่าด้วยเขตเวลา "ประทับในนั้น" คิดว่ามันเป็นอะไรนอกจากจำนวน หมายเลขนั้นคือจำนวนมิลลิวินาทีตั้งแต่ 1970 มกราคม 1 UTC จนถึงตอนนี้ (ขณะนี้อยู่ใน UTC ด้วย) ดังนั้นเมื่อใดก็ตามที่คุณสร้างวัตถุวันที่มันจะอยู่ใน UTC หลังฉากจริงๆ คุณสามารถแสดงเป็นการตั้งค่าตำแหน่งที่ตั้ง (toLocaleString () หรือใน UTC (toUTCString ()) คุณไม่จำเป็นต้องแปลงอะไรด้วยตัวเองสร้างด้วย utc millisec ทุกอย่างสร้างด้วย string - ตราบเท่าที่อยู่ในเขตเวลาท้องถิ่น
da Bich

2
1234567890000 ได้รับการปฏิบัติเช่นเดียวกับ 1234567890 หรือที่รู้จักว่าปัญหา Y39K ...
muttonUp

1
@muttonUp มีการหลอมรวมเป็น 1000 แต่ปัญหา 'Y39K "google ไม่ได้ให้ผลลัพธ์ที่ถูกต้องใด ๆ URL ใด ๆ ที่จะเป็นประโยชน์
P Satish Patro

238

ง่ายnew Date()เพียงแค่ใช้เวลามิลลิวินาทีเช่น

new Date(1394104654000)
> Thu Mar 06 2014 06:17:34 GMT-0500 (EST)

6
ทำได้ดีนี่! นี่ควรเป็นคำตอบที่ยอมรับได้จริง ๆ
Nizar B.

อันนี้ใช้งานไม่ได้สำหรับฉันมันทำงานเมื่อคุณมีเวลา แต่ด้วย utc ยุคคุณต้องตั้ง utcseconds ด้วยตนเองคำตอบที่ยอมรับคือคำตอบที่ถูกต้อง
sameerali

12
นี่คือคำตอบที่เหมาะสม วันที่ใหม่อาจใช้เวลามิลลิวินาทีดังนั้นเพียงแค่คูณด้วย const d = new Date(epoch * 1000)1000:
vinyll

@sameerali บางทีคุณอาจมีปัญหาบางอย่างกับระบบของคุณหรือคุณสับสน คำตอบนี้เป็นคำตอบที่ถูกต้อง ความหมายของยุค Unix: จำนวนวินาทีที่ผ่านไปนับตั้งแต่ 1 มกราคม UTC เพียงแค่คูณด้วย 1,000 เพื่อรับจำนวนมิลลิวินาทีที่ผ่านไป
ใกล้

32

และสำหรับบันทึกฉันทำสิ่งนี้โดยใช้ห้องสมุดMoment.jsซึ่งฉันใช้สำหรับการจัดรูปแบบแล้ว

moment.utc(1234567890000).local()
>Fri Feb 13 2009 19:01:30 GMT-0430 (VET)

1
ช่วงเวลาเป็นสิ่งที่ดี แต่มันก็บ้าที่จะใช้ไลบรารี 1.3MB เพื่อแปลงหนึ่งวันให้เป็นวันที่ ไม่น่าแปลกใจที่มีปมแอปป่องมากมาย
not2qubit

20

เวลาของยุคคือวินาทีจาก 1 มกราคม 1970 date.getTime()ส่งกลับมิลลิวินาทีจาก 1 มกราคม 1970 ดังนั้น .. หากคุณมีเวลาประทับของยุคเปลี่ยนเป็นเวลาประทับ javascript โดยคูณด้วย 1,000

   function epochToJsDate(ts){
        // ts = epoch timestamp
        // returns date obj
        return new Date(ts*1000);
   }

   function jsDateToEpoch(d){
        // d = javascript date obj
        // returns epoch timestamp
        return (d.getTime()-d.getMilliseconds())/1000;
   }

สงสัยว่าเกิดอะไรขึ้นบนโลกนี้ ดีมากที่รู้epochTime! == javascriptTimeเมื่อถึงวันที่ในการแยกวิเคราะห์ ขอบคุณ!
GrayedFox

16
 function ToLocalDate (inDate) {
    var date = new Date();
    date.setTime(inDate.valueOf() - 60000 * inDate.getTimezoneOffset());
    return date;
}

1
คุณทำวันของฉัน TY ฉันเพิ่งแทนที่เครื่องหมายลบด้วยเครื่องหมายบวกสำหรับงานของฉัน
Ludovic Kuty

5

ในการแปลงเวลายุคปัจจุบันใน [ms] เป็นเวลา 24 ชั่วโมง คุณอาจต้องระบุตัวเลือกเพื่อปิดการใช้งานรูปแบบ12 ชั่วโมง

$ node.exe -e "var date = new Date(Date.now()); console.log(date.toLocaleString('en-GB', { hour12:false } ));"

2/7/2018, 19:35:24

หรือเป็น JS:

var date = new Date(Date.now()); 
console.log(date.toLocaleString('en-GB', { hour12:false } ));
// 2/7/2018, 19:35:24

console.log(date.toLocaleString('en-GB', { hour:'numeric', minute:'numeric', second:'numeric', hour12:false } ));
// 19:35:24

หมายเหตุ:การใช้en-GBที่นี่เป็นเพียงตัวเลือก (สุ่ม) ของสถานที่โดยใช้รูปแบบ 24 ชั่วโมงไม่ใช่เขตเวลาของคุณ!


1
นี่เป็นวิธีที่ดีที่สุดในการรับการแปลงรูปแบบใด ๆ จากวิธี Date ขอบคุณ!
SeaWarrior404

สิ่งเดียวที่ฉันไม่ชอบกับข้างต้นคือมันคืนวันที่ในรูปแบบที่คลุมเครือd/m/yyyyหรือมันคือm/d/yyyyอะไร? ทางขวา (ตรรกะมากที่สุด) yyyy-mm-ddวิธีการแสดงนี้ควรจะเป็น: ผู้รับใด ๆ
not2qubit

4

เวลาของยุค (เช่นเวลา Unix Epoch) เกือบตลอดเวลาเป็นจำนวนวินาทีที่หมดอายุตั้งแต่วันที่ 1 มกราคม 1970 00:00:00 (เวลา UTC) ไม่ใช่จำนวนมิลลิวินาทีซึ่งคำตอบบางส่วนของที่นี่มีความหมายโดยนัย

https://en.wikipedia.org/wiki/Unix_time

ดังนั้นถ้าคุณได้รับค่าเวลา Unix Epoch 1547035195มันอาจจะอยู่ในวินาทีและจะมีลักษณะบางอย่างเช่น หากคุณต้องการให้มนุษย์นี้อ่านได้ใน JavaScript คุณจะต้องแปลงค่าเป็นมิลลิวินาทีและส่งค่านั้นไปยังตัวDate(value)สร้างเช่น:

const unixEpochTimeMS = 1547035195 * 1000;
const d = new Date(unixEpochTimeMS);
// Careful, the string output here can vary by implementation...
const strDate = d.toLocaleString();

คุณไม่จำเป็นต้องทำตามd.setUTCMilliseconds(0)ขั้นตอนในคำตอบที่ยอมรับเนื่องจากตัวDate(value)สร้างJavaScript ใช้ค่าUTCเป็นมิลลิวินาที (ไม่ใช่เวลาท้องถิ่น)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#Syntax

นอกจากนี้โปรดทราบว่าคุณควรหลีกเลี่ยงการใช้Date(...)Constructor ที่รับการแทนสตริง datetime ไม่แนะนำให้ทำเช่นนี้ (ดูลิงค์ด้านบน)


3

คุณแค่ขอให้แปลงสตริง UTC เป็นสตริง "ท้องถิ่น" หรือไม่? คุณสามารถทำได้:

var utc_string = '2011-09-05 20:05:15';
var local_string = (function(dtstr) {
    var t0 = new Date(dtstr);
    var t1 = Date.parse(t0.toUTCString().replace('GMT', ''));
    var t2 = (2 * t0) - t1;
    return new Date(t2).toString();
})(utc_string);

3

นอกเหนือจากคำตอบข้างต้นโดย @djechlin

d = '1394104654000';
new Date(parseInt(d));

แปลงเวลาของ EPOCH เป็นวันที่มนุษย์สามารถอ่านได้ อย่าลืมเวลาประเภทยุคนั้นต้องเป็นจำนวนเต็ม


3

ทางออกที่ง่ายที่สุดที่ฉันเคยพบมาคือ:

var timestamp = Date.now(), // returns milliseconds since epoch time
    normalisedTime = new Date(timestamp);

สังเกตว่าสิ่งนี้ไม่มีคำ* 1000อธิบายท้ายnew Date(timestamp)เรื่อง (สำหรับฉันต่อไป!) ดูเหมือนว่าจะให้วันที่ผิดเสมอแทนการให้ปี 2019 มันให้ปีเป็น 51015 ดังนั้นแค่จำไว้


2

หากคุณต้องการแก้ไขการประทับเวลาและวันที่แปลงจากและเป็น UTC และเวลาท้องถิ่นโดยไม่ต้องใช้ห้องสมุดเช่น moment.js ลองดูที่ตัวเลือกด้านล่าง

สำหรับแอปพลิเคชันที่ใช้การประทับเวลา UTC คุณอาจต้องแสดงวันที่ในเบราว์เซอร์โดยพิจารณาจากเขตเวลาท้องถิ่นและการปรับเวลาตามฤดูกาลเมื่อมีผลบังคับใช้ การแก้ไขวันที่ที่อยู่ในเวลาออมแสงแตกต่างกันถึงแม้ว่าในเขตเวลาเดียวกันอาจมีความยุ่งยาก

NumberและDateส่วนขยายด้านล่างช่วยให้คุณสามารถแสดงและได้รับวันที่ในเขตเวลาของการประทับเวลาที่ ตัวอย่างเช่นสมมติว่าคุณอยู่ในแวนคูเวอร์หากคุณกำลังแก้ไขวันที่ในเดือนกรกฎาคมหรือในเดือนธันวาคมอาจหมายถึงคุณกำลังแก้ไขวันที่ใน PST หรือ PDT

ฉันแนะนำให้คุณตรวจสอบ Code Snippet ด้านล่างเพื่อทดสอบวิธีนี้

การแปลงจากมิลลิวินาที

Number.prototype.toLocalDate = function () {
    var value = new Date(this);

    value.setHours(value.getHours() + (value.getTimezoneOffset() / 60));

    return value;
};

Number.prototype.toUTCDate = function () {
    var value = new Date(this);

    value.setHours(value.getHours() - (value.getTimezoneOffset() / 60));

    return value;
};

การแปลงจากวันที่

Date.prototype.getUTCTime = function () {
    return this.getTime() - (this.getTimezoneOffset() * 60000);
};

การใช้

// Adds the timezone and daylight savings if applicable
(1499670000000).toLocalDate();

// Eliminates the timezone and daylight savings if applicable
new Date(2017, 6, 10).getUTCTime();

ดูด้วยตัวคุณเอง


นี่คือคำตอบที่แท้จริง ทำงานเหมือนเสน่ห์สำหรับฉัน การตั้งค่าวันที่ใหม่ (0) และเพิ่มมิลลิวินาทีเหมือนกับวันที่ใหม่ (มิลลิวินาที)
Jersey_Guy

1

แก้ไข

var utcDate = new Date(incomingUTCepoch);
var date = new Date();
date.setUTCDate(utcDate.getDate());
date.setUTCHours(utcDate.getHours());
date.setUTCMonth(utcDate.getMonth());
date.setUTCMinutes(utcDate.getMinutes());
date.setUTCSeconds(utcDate.getSeconds());
date.setUTCMilliseconds(utcDate.getMilliseconds());

แก้ไขการแก้ไข


ฉันทำสิ่งนี้ในตัวอย่างที่สอง ความแตกต่างที่ทำให้ฉันอยู่ระหว่าง 50 ถึง 900 ซึ่งเป็นหน่วยเป็นมิลลิวินาที (แสดงเวลาระหว่างการประมวลผลการคำนวณไม่ใช่ความแตกต่างที่แท้จริง)
Shane Reustle

ไม่มีใครช่วยฉันได้ พวกเขาขาดวิธี setUTCTime ซึ่งน่าจะสมบูรณ์แบบ: P w3schools.com/jsref/jsref_obj_date.asp
Shane Reustle

ไม่ทำงานอย่างน้อยบน Firefox สำหรับ Ubuntu รหัสไม่ควรตั้งค่าวัน / เดือน / ปีหลังจากกำหนดวันที่
Simon Kozlov

@Simon Kozlov ที่จริงแล้วมันเป็นข้อสันนิษฐานที่ไม่ถูกต้องในอ็อบเจกต์วันที่ setDate และ getDate อ้างถึงวันในเดือนและปัญหาก็คือฉันใช้ฟังก์ชั่นเช่น (setUTCDay) ที่ไม่ได้แปลกใจที่มันได้รับการยอมรับ !!
Amjad Masad

@AmjadMasad คำตอบของคุณจะมีประโยชน์มากขึ้นถ้าคุณแสดงผลลัพธ์ที่คาดหวัง
not2qubit

0

พิจารณาคุณมีepoch_timeพร้อมใช้งาน

// for eg. epoch_time = 1487086694.213
var date = new Date(epoch_time * 1000); // multiply by 1000 for milliseconds
var date_string = date.toLocaleString('en-GB');  // 24 hour format


0

@ Amjad ความคิดที่ดี แต่การใช้งานที่ดีขึ้นจะเป็น:

Date.prototype.setUTCTime = function(UTCTimestamp) {
    var UTCDate = new Date(UTCTimestamp);
    this.setUTCFullYear(UTCDate.getFullYear(), UTCDate.getMonth(), UTCDate.getDate());
    this.setUTCHours(UTCDate.getHours(), UTCDate.getMinutes(), UTCDate.getSeconds(), UTCDate.getMilliseconds());
    return this.getTime();
}

-1

ก่อนอื่นให้แปลงเป็น String จากนั้นแทนที่ข้อความเขตเวลา

function convertUnixTime(time) {
  return new Date(time*1000).toString().replace("GMT+0530 (Sri Lanka Standard Time)","");
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.