ฉันจะรับ UTC Timestamp ใน JavaScript ได้อย่างไร


157

ในขณะที่เขียนแอปพลิเคชันเว็บการเก็บข้อมูล (ฝั่งเซิร์ฟเวอร์) ชุดข้อมูลทั้งหมดในฐานข้อมูลเป็น UTC ประทับเวลา

ฉันประหลาดใจเมื่อฉันสังเกตเห็นว่าคุณไม่สามารถทำอะไรได้มากในแง่ของการจัดการเขตเวลาใน JavaScript

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

คุณเห็นปัญหาสำคัญ ๆ ที่นี่ได้ไหม? หรืออาจจะเป็นทางออกจากมุมที่แตกต่างกัน?

Date.prototype.getUTCTime = function(){ 
  return new Date(
    this.getUTCFullYear(),
    this.getUTCMonth(),
    this.getUTCDate(),
    this.getUTCHours(),
    this.getUTCMinutes(), 
    this.getUTCSeconds()
  ).getTime(); 
}

ดูเหมือนว่าจะทำให้ฉันสับสนเล็กน้อย และฉันก็ไม่แน่ใจเกี่ยวกับประสิทธิภาพเช่นกัน


ฉันรู้ว่านี่เป็นคำถามแบบเก่า แต่พยายามไม่ขยายวัตถุดั้งเดิมเช่นวัตถุวันที่ โหวตขึ้นเพราะฉันชอบคำถามตัวเอง
trysis

Date.parse (วันที่ใหม่ (). toUTCString ())
Sagi

25
นี่เป็นคำถามเก่าที่มาในฟีดของฉันวันนี้และมันเต็มไปด้วยข้อมูลที่ผิด การประทับเวลาอยู่ใน UTC เสมอ new Date().toString()จะแสดงการแสดงเวลาในเขตเวลาปัจจุบันกับคุณnew Date().toUTCString()จะแสดงเวลา UTC ใหม่ แต่new Date().getTime()เป็นUTC เสมอเพราะนั่นคือสิ่งที่เวลา Unix ถูกกำหนดเป็น: "เวลา Unix (หรือที่รู้จักกันว่าเวลา POSIX หรือเวลายุค) เป็นระบบสำหรับการอธิบาย instants ในเวลาที่กำหนดเป็นจำนวนวินาทีที่ผ่านไปตั้งแต่ 00:00:00 เวลาสากลเชิงพิกัด (UTC) วันพฤหัสบดีที่ 1 มกราคม 1970 ไม่นับวินาทีกระโดด "
Amadan

คำตอบ:


155
  1. วันที่สร้างด้วยวิธีนี้จะใช้เขตเวลาท้องถิ่นทำให้วันที่สร้างไม่ถูกต้อง การตั้งค่าเขตเวลาของวัตถุวันที่ที่แน่นอนคือการสร้างมันจากสตริงวันที่ที่มีเขตเวลา (ฉันมีปัญหาในการทำงานกับเบราว์เซอร์ Android รุ่นเก่า)

  2. โปรดทราบว่าgetTime()ส่งกลับมิลลิวินาทีไม่ใช่วินาทีธรรมดา

สำหรับการประทับเวลา UTC / Unix ข้อมูลต่อไปนี้น่าจะพอเพียง:

Math.floor((new Date()).getTime() / 1000)

มันจะส่งผลให้เขตเวลาปัจจุบันตรงข้ามกับผลลัพธ์ สำหรับการแสดงสตริงคำตอบของ David Ellis นั้นใช้ได้ผล

เพื่อชี้แจง:

new Date(Y, M, D, h, m, s)

การป้อนข้อมูลที่จะถือว่าเป็นเวลาท้องถิ่น หากเวลา UTCถูกส่งผ่านผลลัพธ์จะแตกต่างกัน สังเกต (ฉันอยู่ใน GMT +02: 00 ตอนนี้และมันเป็นเวลา 07:50):

> var d1 = new Date();
> d1.toUTCString();
"Sun, 18 Mar 2012 05:50:34 GMT" // two hours less than my local time
> Math.floor(d1.getTime()/ 1000)
1332049834 

> var d2 = new Date( d1.getUTCFullYear(), d1.getUTCMonth(), d1.getUTCDate(), d1.getUTCHours(), d1.getUTCMinutes(), d1.getUTCSeconds() );
> d2.toUTCString();
"Sun, 18 Mar 2012 03:50:34 GMT" // four hours less than my local time, and two hours less than the original time - because my GMT+2 input was interpreted as GMT+0!
> Math.floor(d2.getTime()/ 1000)
1332042634

นอกจากนี้โปรดทราบว่าgetUTCDate()ไม่สามารถทดแทนgetUTCDay()ได้ เพราะนี่คือgetUTCDate()ผลตอบแทนวันของเดือน ; ในขณะที่getUTCDay()ผลตอบแทนวันของสัปดาห์


1
1) ผมไม่ได้สร้างวันที่ ... ฉันจะเพิ่มฟังก์ชั่นต้นแบบที่ทำงานบนนี้ 2) จุดดีฉันควรทำ Math.floor / 1000 - แต่ฉันก็ยังต้องการฟังก์ชันนั้นเพื่อให้มีเวลาประทับ UTC ของวัตถุวันที่ที่มีอยู่ ... ใช่ไหม
Merc

@Merc: 1) คุณกำลังโทรหาnew Date()ซึ่งจะสร้างวันที่ใหม่จากอินพุต UTC ของคุณ แต่ถือว่าเป็นวันที่ / เวลาท้องถิ่น 2) ใช่คุณควรใช้Math.floor(this.getTime() / 1000)ในกรณีนี้
DCoder

ตอบที่นี่เพราะฉันต้องอัปเดตรหัส ... นี่คือการมีการประทับเวลา Unix ใน UTC สำหรับวันที่มีอยู่ : function () {return Math.floor (วันที่ใหม่ (this.getUTCFullYear (), this.getUTCMonth (), this.getUTCDate (), this.getUTCHours (), this.getUTCMinutes (), this.getUTCSeconds ()) .getTime () / 1,000); } ซึ่งหมายความว่าฉันสามารถทำได้: var n = new Date (2008,10,10) ... ... n.getUTCTime (); (สิ่งนี้จะแตกต่างกับ n.getUTCTime ())
Merc

1
ขอบคุณ Bro ไฟล์ทำงาน Math.floor ((วันที่ใหม่ ()). getTime () / 1,000)
Manoj Patel

51

คุณสามารถทำได้โดยใช้ getTimezoneOffset และ getTime

x = new Date()
var UTCseconds = (x.getTime() + x.getTimezoneOffset()*60*1000)/1000;

console.log("UTCseconds", UTCseconds)


4
ขอบคุณนี่ไม่มีที่ไหนที่จะพบได้บนอินเทอร์เน็ต!
Theofanis Pantelides

ฉันทดสอบรหัสต่อไปนี้: var tt = new Date('Thu Jan 01 1970 08:00:00 GMT+0800 (China Standard Time)'); (tt.getTime() - tt.getTimezoneOffset()*60*1000)/1000. มันดูเหมือนเป็นที่ถูกต้องสำหรับtt.getTime() - tt.getTimezoneOffset() GMT+0800
zangw

1
นี้จะดีกว่าvar UTCseconds = (Math.floor(x.getTime()/1000) + x.getTimezoneOffset()*60)
StefansArya

ดูเหมือนว่ามันจะไม่ทำงานตามที่เขียนไว้ .. ดูเหมือนว่าคุณจะต้องผ่านเข้าไปในสตริงเวลาnew Date()ซึ่งรวมถึงเขตเวลา.. ซึ่งจะเอาชนะจุดประสงค์ของการพยายามทำมันใน js ..
claudekennilol

นี่เป็นความผิดพลาดค่าที่กำหนดให้UTCseconds ไม่ใช่ UTC วินาที .. ค่าเวลาของวันที่คือ UTC การเปลี่ยนแปลงด้วยวิธีใดก็ตามหมายความว่ามันหมายถึงช่วงเวลาที่แตกต่างกัน
RobG

35

วิธีที่ง่ายที่สุดในการรับเวลา UTC ในรูปแบบทั่วไปมีดังนี้:

new Date().toISOString()
"2016-06-03T23:15:33.008Z"

3
นี่คือคำตอบที่ถูกต้อง คำตอบอื่น ๆ อีกมากมายให้ "สตริงเวลาสากล" แต่ไม่ได้ให้ "เวลาพิกัดสากล" ปัจจุบัน ฉันไม่เข้าใจว่าทำไมทุกอย่างซับซ้อนมากที่นี่
gburton

ขอบคุณ @gburton ขอบคุณที่คุณเห็นวิธีที่ง่ายต่อความจริง :)
Tahsin Turkoz

1
ฉันใช้สิ่งนี้พร้อมกับ ".split ('T') [0]" สำหรับการเปรียบเทียบตามวันที่แบบ YYYY-MM-DD
Sean O

ยินดีที่ได้ @SeanO
Tahsin Turkoz

นี่เป็นสตริงเวลา UTC แต่ OP ขอขอเวลาประทับ UTC (ยุค)
Jordi Nebot

13

ฉันคิดว่าค่าวันที่ใน js นั้นดีกว่าวัตถุ C # DateTime มาก ออบเจ็กต์ C # DateTime มีคุณสมบัติ Kind แต่ไม่มีเขตเวลาอ้างอิงที่เข้มงวดเช่นนี้และการแปลงเขตเวลานั้นยากที่จะติดตามหากคุณแปลงระหว่างเวลาที่ไม่ใช่ UTC สองครั้งและไม่ใช่เวลาท้องถิ่น ใน js ค่าวันที่ทั้งหมดมีค่า UTC พื้นฐานซึ่งส่งผ่านและรู้จักโดยไม่คำนึงถึงการแปลงที่ไม่เหมาะสมหรือการแปลงเขตเวลาที่คุณทำ การร้องเรียนที่ใหญ่ที่สุดของฉันเกี่ยวกับออบเจกต์ Date คือจำนวนพฤติกรรมที่ไม่ได้กำหนดซึ่งผู้ใช้งานเบราว์เซอร์เลือกที่จะรวมซึ่งอาจสร้างความสับสนให้ผู้ที่โจมตีเดตใน js ด้วยการลองผิดลองถูกกว่าการอ่านสเป็ค การใช้บางอย่างเช่น iso8601.js จะช่วยแก้พฤติกรรมที่แตกต่างกันนี้โดยการกำหนดการใช้งานวัตถุวันที่ครั้งเดียว

ตามค่าเริ่มต้นข้อมูลจำเพาะระบุว่าคุณสามารถสร้างวันที่ด้วยรูปแบบวันที่ ISO 8601 ที่ขยายเพิ่มเช่น

var someDate = new Date('2010-12-12T12:00Z');

ดังนั้นคุณสามารถสรุปเวลา UTC ที่แน่นอนด้วยวิธีนี้

เมื่อคุณต้องการส่งผ่านค่าวันที่กลับไปยังเซิร์ฟเวอร์ที่คุณต้องการโทร

someDate.toISOString();

หรือหากคุณต้องการทำงานกับการประทับเวลามิลลิวินาที (จำนวนมิลลิวินาทีจาก 1 มกราคม 1970 UTC)

someDate.getTime();

ISO 8601 เป็นมาตรฐาน คุณไม่สับสนเกี่ยวกับความหมายของสตริงวันที่หากคุณรวมออฟเซ็ตวันที่ สิ่งนี้หมายความว่าอย่างไรสำหรับคุณในฐานะนักพัฒนาคือคุณไม่ต้องจัดการกับเวลาท้องถิ่นด้วยตัวคุณเองไม่เคยมีการจัดการกับการแปลงเวลาท้องถิ่นตัวเองค่าเวลาท้องถิ่นมีอยู่จริงเพื่อประโยชน์ของผู้ใช้และค่าวันที่ตามค่าเริ่มต้นแสดงในเวลาท้องถิ่นของพวกเขา การปรับเปลี่ยนเวลาท้องถิ่นทั้งหมดอนุญาตให้คุณแสดงสิ่งที่สมเหตุสมผลแก่ผู้ใช้และแปลงสตริงจากอินพุตของผู้ใช้ เป็นวิธีปฏิบัติที่ดีในการแปลงเป็น UTC ทันทีที่คุณทำได้และวัตถุ js Date ทำให้เป็นเรื่องเล็กน้อย

ข้อเสียไม่มีขอบเขตในการบังคับใช้เขตเวลาหรือตำแหน่งที่ตั้งสำหรับลูกค้า (ที่ฉันรู้) ซึ่งอาจสร้างความรำคาญให้กับการตั้งค่าเฉพาะเว็บไซต์ แต่ฉันเดาว่าเหตุผลที่อยู่เบื้องหลังคือผู้ใช้ การกำหนดค่าที่ไม่ควรสัมผัส

ดังนั้นในระยะสั้นเหตุผลที่ไม่มีการสนับสนุนดั้งเดิมสำหรับการจัดการโซนเวลามากนักเพราะคุณไม่ต้องการทำมัน


12

โดยทั่วไปคุณไม่จำเป็นต้องทำ "การจัดการเขตเวลา" ในฝั่งไคลเอ็นต์ ตามกฎแล้วฉันพยายามจัดเก็บและทำงานกับวันที่ UTC ในรูปแบบของticksหรือ " จำนวนมิลลิวินาทีนับตั้งแต่เที่ยงคืนของวันที่ 1 มกราคม 1970 " วิธีนี้ช่วยลดความยุ่งยากในการจัดเก็บการเรียงลำดับการคำนวณออฟเซ็ตและที่สำคัญที่สุดทำให้คุณปวดหัวกับการปรับ "Daylight Saving Time" นี่คือรหัส JavaScript เล็กน้อยที่ฉันใช้

ในการรับเวลา UTC ปัจจุบัน:

function getCurrentTimeUTC()
{
    //RETURN:
    //      = number of milliseconds between current UTC time and midnight of January 1, 1970
    var tmLoc = new Date();
    //The offset is in minutes -- convert it to ms
    return tmLoc.getTime() + tmLoc.getTimezoneOffset() * 60000;
}

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

function formatDateTimeFromTicks(nTicks)
{
    //'nTicks' = number of milliseconds since midnight of January 1, 1970
    //RETURN:
    //      = Formatted date/time
    return new Date(nTicks).toLocaleString();
}

function formatDateFromTicks(nTicks)
{
    //'nTicks' = number of milliseconds since midnight of January 1, 1970
    //RETURN:
    //      = Formatted date
    return new Date(nTicks).toLocaleDateString();
}

function formatTimeFromTicks(nTicks)
{
    //'nTicks' = number of milliseconds since midnight of January 1, 1970
    //RETURN:
    //      = Formatted time
    return new Date(nTicks).toLocaleTimeString();
}

ดังนั้นตัวอย่างต่อไปนี้:

var ticks = getCurrentTimeUTC();  //Or get it from the server

var __s = "ticks=" + ticks + 
    ", DateTime=" + formatDateTimeFromTicks(ticks) +
    ", Date=" + formatDateFromTicks(ticks) +
    ", Time=" + formatTimeFromTicks(ticks);

document.write("<span>" + __s + "</span>");

ส่งกลับค่าต่อไปนี้ (สำหรับสถานที่ภาษาอังกฤษแบบสหรัฐอเมริกา):

ticks = 1409103400661, DateTime = 8/26/2014 6:36:40 PM, วันที่ = 8/26/2014, เวลา = 6: 36: 40 PM


1
ด้วยการเพิ่มgetTimezoneOffsetค่าในgetCurrentTimeUTCฟังก์ชั่นของคุณจริง ๆ แล้วคุณกลับจุดในเวลาที่แตกต่างกัน ผลมาจากการgetTimeเป็นอยู่แล้วในเวลา UTC
Matt Johnson-Pint

1
@ MattJohnson: นั่นไม่ถูกต้อง ผลลัพธ์ของtmLoc.getTime()การชดเชยกับเวลาท้องถิ่น นั่นเป็นเรื่องง่ายที่จะตรวจสอบว่าคุณมีสิทธิ์เข้าถึงสิ่งที่เรียกใช้ JavaScript หรือไม่
ahmd0

2
ขออภัย แต่นั่นไม่เป็นความจริง ดูการอ้างอิง MDN คุณสามารถเห็นสิ่งนี้ได้ในข้อมูลจำเพาะ ECMAScript §15.9.3.3อธิบายgetTimeซึ่งจะชี้ให้คุณที่ "ค่าเวลา" ที่กำหนดใน§15.9.5ซึ่งเป็น a PrimitiveValueตามที่กำหนดไว้ใน§15.9.3.3อย่างชัดเจนว่าเป็น UTC
Matt Johnson-Pint

2
เมื่อคุณได้รับtmLocผ่านnew Date()ก็เหมือนกัน เขตเวลาจะมีผลต่อเอาต์พุตสตริงของtmLoc.toString()และรายการที่คล้ายกัน แต่จะไม่ส่งผลกระทบต่อtmLoc.getTime() นั่นเป็นเพียงจำนวนมิลลิวินาทีเสมอตั้งแต่เที่ยงคืน 1970-01-01 ใน UTC
Matt Johnson-Pint

1
@StefansArya://The offset is in minutes -- convert it to ms
ahmd0

5

ฉันคิดว่านี่เป็นทางออกที่ดีกว่า

// UTC milliseconds
new Date(Date.now()+(new Date().getTimezoneOffset()*60000)).getTime()

// UTC seconds
new Date(Date.now()+(new Date().getTimezoneOffset()*60000)).getTime()/1000|0

คำตอบที่ผิดอีกข้อหนึ่งgetTimeจะส่งกลับค่าชดเชย UTC เพิ่มการชดเชยเขตเวลาท้องถิ่นทำให้เกิดความสับสน ECMAScript offsets เป็น + ve สำหรับทิศตะวันตกและ -ve สำหรับตะวันออกดังนั้นพวกเขาควรถูกลบออกจาก UTC เพื่อรับท้องถิ่น แต่เนื่องจากค่าเวลาคือ UTC ที่จะเริ่มต้นด้วยการเพิ่มเป็นหลักจะย้ายมันออกจาก UTC ในทิศทางตรงกันข้ามกับการชดเชยในท้องถิ่น
RobG

4

ถ้าคุณต้องการหนึ่งซับ , The UTC Unix Timestampสามารถสร้างขึ้นใน JavaScript เป็น:

var currentUnixTimestap = ~~(+new Date() / 1000);

สิ่งนี้จะคำนึงถึงเขตเวลาของระบบ โดยทั่วไปเวลาจะผ่านไปในวินาทีตั้งแต่ยุค

มันทำงานอย่างไร:

  • new Date()สร้างวัตถุวันที่:
  • แปลงการประทับเวลาโดยการเพิ่มก่อนที่จะสร้างวัตถุเพื่อแปลงเป็นunary + timestamp integer: +new Date().
  • แปลงมิลลิวินาทีเป็นวินาที: +new Date() / 1000
  • ใช้tildes คู่เพื่อปัดเศษค่าเป็นจำนวนเต็ม :~~(+new Date())

7
มันtildeไม่ใช่tilda(sic) น่าเศร้าที่มันไม่ให้ฉันลบคำผิดฉันต้องแก้ไขตัวอักษรอย่างน้อย 6 ตัว Smooth, Stackexchange, smooth
Fred

3
อย่าใช้นี้ ด้วยข้อมูลจำเพาะ ecma ปัจจุบันการทำงานระดับบิต (เช่นตัวหนอน - ไม่ได้ระดับบิต) จัดการค่าจำนวนเต็มที่ลงนามเป็น 32 บิต นั่นหมายถึงเวทย์มนตร์ตัวหนอนนี้จะไม่ทำงานหลังจากวันที่ 19 มกราคม 2038 เมื่อค่าการประทับเวลาจะสูงกว่าค่าสูงสุดของจำนวนเต็ม 32 บิตที่ลงชื่อ jsfiddle.net/phb20ymb
Sharky

3

ฉันต้องการทำให้ชัดเจนว่า Date ใหม่ (). getTime () จะส่งคืนค่า UTC ดังนั้นจึงเป็นวิธีที่มีประโยชน์มากในการจัดเก็บและจัดการวันที่ในแบบที่ไม่เชื่อเรื่องเวลา

พูดอีกอย่างคืออย่ารบกวนฟังก์ชั่น UTC javascript ทั้งหมด ให้ใช้ Date.getTime () แทน

ข้อมูลเพิ่มเติมเกี่ยวกับคำอธิบายอยู่ที่นี่: หาก javascript "(new Date ()). getTime ()" ถูกเรียกใช้จากเขตเวลาที่แตกต่างกัน 2 แห่ง


3

ฉันใช้สิ่งต่อไปนี้:

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

เมื่อกำหนดวิธีนี้แล้วคุณสามารถทำได้:

var utcTime = new Date().getUTCTime();

ทางออกที่สะอาดที่สุด ขอบคุณ!
avalanche1

แต่นั่นไม่ใช่วิธีที่สะอาดในการส่งวันที่เพราะ TimeStamps เป็น UTC เสมอ ทางออกที่ดีที่สุดสำหรับฉันเมื่อส่งวันที่คือการใช้การแสดงสตริงเช่น "dd / MM / yyyy HH: mm: ss" แล้วแยกวิเคราะห์ทางฝั่งเซิร์ฟเวอร์ด้วย TimeZone เริ่มต้นของเซิร์ฟเวอร์เพื่อรับเวลา UTC หรืออะไรก็ตาม ดูคำตอบ
jlbofh

2
การแยกสตริง - คุณกำลังเรียกว่าสะอาดหรือไม่ meh
avalanche1

ตรวจสอบให้แน่ใจว่ามีวิธีการสร้างวันที่ในรูปแบบสตริงตามข้อกำหนด ISO วิธีการคือ toISOString () คุณสามารถวิเคราะห์ได้อย่างสมบูรณ์ใน Java โดยใช้สิ่งที่ต้องการ:DateTime dt = new DateTime ("2018-07-15T02:36:00+02:00");
jlbofh

อีกคำตอบที่ไม่ถูกต้องthis.getTime()ส่งคืน UTC ออฟเซ็ตการลบออฟเซ็ตเขตเวลาท้องถิ่นทำให้เป็นโลคัลไม่ใช่ UTC ดังนั้นgetUTCTimeส่งคืนออฟเซ็ตท้องถิ่นไม่ใช่ UTC
RobG

2

ฉันประหลาดใจที่คำถามนี้ซับซ้อนเพียงใด

สิ่งเหล่านี้เหมือนกันหมดและค่าจำนวนเต็มทั้งหมด === เวลา: D

console.log((new Date()).getTime() / 1000, new Date().valueOf() / 1000, (new Date() - new Date().getTimezoneOffset() * 60 * 1000) / 1000);

อย่าเชื่อฉันเช็คเอาต์: http://www.epochconverter.com/


2

เนื่องจากnew Date().toUTCString()ส่งคืนสตริงเหมือน"Wed, 11 Oct 2017 09:24:41 GMT"คุณสามารถแบ่งอักขระ 3 ตัวสุดท้ายและส่งสตริงที่แบ่งส่วนเป็นnew Date():

new Date()
// Wed Oct 11 2017 11:34:33 GMT+0200 (CEST)

new Date(new Date().toUTCString().slice(0, -3))
// Wed Oct 11 2017 09:34:33 GMT+0200 (CEST)

1

แก้ไข: รหัสด้านล่างใช้งานไม่ได้ ฉันมักจะสมมติว่าวันที่ใหม่ (). getTime () ส่งคืนจำนวนวินาทีตั้งแต่วันที่ 1 มกราคม 1970 ในช่วงเวลาปัจจุบัน นี่ไม่ใช่กรณี: getTime () ส่งคืนจำนวนวินาทีใน UTC ดังนั้นรหัสด้านล่างจึงมีการปรับตัวมากเกินไป ขอบคุณทุกคน!]

ก่อนอื่นขอขอบคุณสำหรับความเข้าใจที่ยอดเยี่ยมของคุณ ฉันเดาว่าคำถามของฉันมีชื่อผิด ... น่าจะเป็น "รับ UTC Unix Timestamp สำหรับวันที่มีอยู่"

ดังนั้นถ้าฉันมีวัตถุวันที่:

var d = new Date(2009,01,31)

ฉันหลังจากฟังก์ชั่นที่จะบอกฉันว่า "UTC Unix Timestamp"

ฟังก์ชั่นนี้ดูเหมือนจะเป็นกลลวงจริง:

Date.prototype.getUTCUnixTime =  function (){
  return Math.floor( new Date(
    this.getUTCFullYear(),
    this.getUTCMonth(),
    this.getUTCDate(),
    this.getUTCHours(),
    this.getUTCMinutes(), 
    this.getUTCSeconds()
  ).getTime() / 1000); 
}

โปรดทราบว่ามันใช้งานได้กับ "นี้" ซึ่งหมายความว่าฉันสามารถทำได้:

var n = new Date(2008,10,10)
...
...

n.getUTCUnixTime();

และรับจำนวนวินาทีตั้งแต่วันที่ 1 มกราคม 1970 ในเวลา Unix ขวา?

สำหรับฉันแล้ว Javascript นั้นเก็บทุกอย่างในเวลา UTC แต่เพื่อให้ได้ตัวเลขนั้นฉันต้องสร้างวัตถุ Date ใหม่ผ่านตัวรับ UTC แต่ละตัวจากนั้นจึงเรียกใช้ getTime () เพื่อ ...

Merc


1
คุณเห็นการอัปเดต @ DCoder ของคำตอบของเขา? วิธีการของคุณgetUTCUnixTimeได้รับเวลาที่ผิดและ JavaScript ไม่ให้เป็นวิธีที่ตรงไปตรงมาจะได้รับการประทับเวลายูนิกซ์จากDateวัตถุ - ใช้getTimeวิธีการ ดูคำตอบอื่น ๆ ทั้งหมด
Anurag

1
เอ่อคุณถูกต้องแค่เห็นพวกเขา (การต่อสู้หัวกับผนัง)
Merc

1

ฉันคิดว่านี่เป็นสิ่งที่คุณคาดหวัง ...

var currTimestamp = Date.now(), //1482905176396
    utcDateString = (new Date(currTimestamp)).toUTCString(); //"Wed, 28 Dec 2016 06:06:50 GMT"

ตอนนี้

new Date(utcDateString).getTime(); //This will give you UTC Timestamp in JavaScript


0

ใช้day.js

ในเบราว์เซอร์:

dayjs.extend(dayjs_plugin_utc)
console.log(dayjs.utc().unix())
<script src="https://cdn.jsdelivr.net/npm/dayjs@latest/dayjs.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@latest/plugin/utc.js"></script>

ใน node.js:

import dayjs from 'dayjs'
dayjs.extend(require('dayjs/plugin/utc'))
console.log(dayjs.utc().unix())

คุณได้รับเวลา UTC unix โดยไม่มีมิลลิวินาที


-2

นี่จะส่งคืนการประทับเวลาใน UTC:

var utc = new Date(new Date().toUTCString()).getTime();


2
สิ่งนี้จะไม่ส่งคืนเวลาใน UTC: new Date(new Date().toUTCString())ให้ Wed Oct 04 2017 07:20:14 GMT + 0200 (GMT + 02: 00)
Bas van Dijk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.