วิธีการแปลงเวลาประทับยูนิกซ์เป็นวันที่ในปฏิทิน moment.js


141

MM/DD/YYYYฉันมีการประทับเวลายูนิกซ์และฉันพยายามที่จะแปลงเป็นปฏิทินวันเช่น จนถึงตอนนี้ฉันมีสิ่งนี้:

$(document).ready(function() {
  var value = $("#unixtime").val(); //this retrieves the unix timestamp
  var dateString = moment(value).calendar(); 
  alert(dateString);
});

เมื่อฉันพยายามพิมพ์วันที่ในปฏิทินหน้าต่างจะระบุว่า "วันที่ไม่ถูกต้อง" ใครช่วยฉันออกได้บ้าง

คำตอบ:


364

การใช้ moment.js ตามที่คุณถามมีunixวิธีที่ยอมรับการประทับเวลา unix ในไม่กี่วินาที:

var dateString = moment.unix(value).format("MM/DD/YYYY");

3
นั่นไม่ใช่วันที่ในปฏิทิน
Ian Warburton

1
@IanWarburton - ยังไม่ได้ ??
Matt Johnson-Pint

ฉันคิดว่ามันเป็นไปตามคำถาม แต่ฉันคิดว่าวันที่ในปฏิทินเป็นช่วงเวลา.jsมีลักษณะเช่นนี้ .... ช่วงเวลา (วันที่ใหม่ (รายการ. วันที่)) ปฏิทิน ()
Ian Warburton

5
@IanWarburton - คุณไม่จำเป็นต้องมีวัตถุวันที่ใหม่ในนั้น calendarฟังก์ชั่นเป็นสิ่งที่ดี ( เอกสารที่นี่ ) แต่ไม่ได้อยู่ในรูปแบบที่ OP ถาม
Matt Johnson-Pint

1
มันน่าสังเกตว่าทำไมคำถามล้มเหลว แต่มันใช้งานได้ สาเหตุเป็นเพราะmonent(number) คาดว่าการประทับเวลา unix ในหน่วยมิลลิวินาที (ซึ่งสอดคล้องกับDateวัตถุ) ในขณะที่การประทับเวลา unix เป็นวินาทีโดยค่าเริ่มต้น ดังนั้นคุณสามารถทำได้moment(value*1000)แทนที่จะmoment.unix(value)ใช้ แต่การใช้unixก็ชัดเจนกว่า
icc97

39

เวลาประทับ UNIX มันนับจากวินาทีจาก 1970 ดังนั้นคุณต้องแปลงเป็นวัตถุ JS Date:

var date = new Date(unixTimestamp*1000);

ใช่นั่นเป็นวิธีแก้ปัญหาของช่วงเวลาล่าสุดหรืออย่างน้อยหนึ่งรุ่นที่ฉันได้รับจาก npm เมื่อเร็ว ๆ นี้ แม้ว่าฉันจะได้รับ. unix () จากช่วงเวลาที่ฉันต้อง * 1,000 เมื่อ instantiating อีกครั้ง ตัวอย่างเช่น: สักครู่ (โมเมนต์ (). unix () * 1,000)
kroe

คำตอบที่ดีที่สุดเมื่อเทียบกับตรรกะ moment.js
Andris


4
new moment(timeStamp,'yyyyMMddHHmmssfff').toDate()

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


3

อาจจะสายไปหน่อย แต่สำหรับปัญหาใหม่แบบนี้ฉันใช้รหัสนี้:

moment(timestamp, 'X').format('lll');

คุณสามารถเปลี่ยนรูปแบบเพื่อให้ตรงกับความต้องการของคุณและเพิ่มเขตเวลาเช่นนี้:

moment(timestamp, 'X').tz(timezone).format('lll');

1
นี่เป็นวิธีที่ดีที่สุดที่ฉันเคยเห็นที่นี่
LukeVenter

1
เพียงเพิ่มคำตอบนี้ (ซึ่งเป็นคำตอบที่ถูกต้องที่สุดที่นี่) ใช้ตัวพิมพ์เล็กxสำหรับการประทับเวลา ms unix เอกสารที่นี่
JonTroncoso


0
$(document).ready(function() {
    var value = $("#unixtime").val(); //this retrieves the unix timestamp
    var dateString = moment(value, 'MM/DD/YYYY', false).calendar(); 
    alert(dateString);
});

มีความเป็นโหมดที่เข้มงวดและโหมดการอภัย

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

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

สถานการณ์ทั่วไปที่โหมดการให้อภัยนั้นมีประโยชน์คือในสถานการณ์ที่ API ของบุคคลที่สามระบุวันที่และรูปแบบวันที่สำหรับ API นั้นสามารถเปลี่ยนแปลงได้ สมมติว่า API เริ่มต้นด้วยการส่งวันที่ในรูปแบบ 'YYYY-MM-DD' จากนั้นเปลี่ยนเป็นรูปแบบ 'MM / DD / YYYY' ในภายหลัง

ในโหมดเข้มงวดรหัสต่อไปนี้ส่งผลให้ 'วันที่ไม่ถูกต้อง' ถูกแสดง:

moment('01/12/2016', 'YYYY-MM-DD', true).format()
"Invalid date"

ในโหมดการให้อภัยโดยใช้สตริงรูปแบบคุณได้รับวันที่ผิด:

moment('01/12/2016', 'YYYY-MM-DD').format()
"2001-12-20T00:00:00-06:00"

วิธีอื่นจะเป็น

$(document).ready(function() {
    var value = $("#unixtime").val(); //this retrieves the unix timestamp
    var dateString = moment.unix(value).calendar(); 
    alert(dateString);
});

0

ฟังก์ชั่นนี้สร้างวันที่จากเวลาประทับ:

    function formatDateTime(dateString) {
        const parsed = moment(new Date(dateString))

        if (!parsed.isValid()) {
            return dateString
        }

        return parsed.format('MMM D, YYYY, HH:mmA')
    }


0
moment(timestamp).format('''any format''')

3
ในขณะที่รหัสนี้อาจแก้ไขปัญหาของ OP ได้ดีที่สุดคือการรวมคำอธิบายเกี่ยวกับวิธีที่รหัสของคุณแก้ไขปัญหาของ OP ด้วยวิธีนี้ผู้เข้าชมในอนาคตสามารถเรียนรู้จากโพสต์ของคุณและนำไปใช้กับรหัสของตนเอง ดังนั้นไม่ใช่บริการการเข้ารหัส แต่เป็นแหล่งความรู้ นอกจากนี้คุณภาพสูงและคำตอบที่สมบูรณ์มีแนวโน้มที่จะถูกถอนออก คุณสมบัติเหล่านี้พร้อมกับข้อกำหนดที่โพสต์ทั้งหมดมีอยู่ในตัวเองเป็นจุดแข็งของ SO ในฐานะแพลตฟอร์มที่แตกต่างจากฟอรัม คุณสามารถแก้ไขเพื่อเพิ่มข้อมูลเพิ่มเติม & / หรือเสริมคำอธิบายของคุณด้วยเอกสารต้นฉบับ
ysf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.