ช่วงเวลา Js UTC เป็นเวลาท้องถิ่น


158

ฉันกำลังพยายามแปลงเวลา UTC เป็นเวลาท้องถิ่น ฉันได้รับการต่อไปเช่นนี้จากลิงค์นี้: http://jsfiddle.net/FLhpq/4/light/ ดูเหมือนว่าฉันไม่สามารถรับเอาต์พุตในเครื่องที่ถูกต้อง ตัวอย่างเช่นถ้า 10:30 น. ที่นี่แทนที่จะได้รับ 10:30 ป่วย 15:30 นี่คือรหัสของฉัน:

var date = moment.utc().format('YYYY-MM-DD HH:mm:ss');

var localTime  = moment.utc(date).toDate();

localTime = moment(localTime).format('YYYY-MM-DD HH:mm:ss');

console.log("moment: " + localTime);

ไม่ว่าฉันจะทำอะไรก็ตามเวลาจะออกมาในเวลา UTC เสมอ ฉันอาศัยอยู่ในฮูสตันดังนั้นฉันจึงรู้ว่าเขตเวลาเป็นปัญหา ฉันทำตามรหัสในลิงก์แล้ว แต่ดูเหมือนจะได้เวลาท้องถิ่น ผมทำอะไรผิดหรือเปล่า?

คำตอบ:


258

การแปลงเวลา UTC moment.local()เพื่อท้องถิ่นที่คุณต้องใช้

สำหรับข้อมูลเพิ่มเติมโปรดดูเอกสาร

ตัวอย่าง:

var date = moment.utc().format('YYYY-MM-DD HH:mm:ss');

console.log(date); // 2015-09-13 03:39:27

var stillUtc = moment.utc(date).toDate();
var local = moment(stillUtc).local().format('YYYY-MM-DD HH:mm:ss');

console.log(local); // 2015-09-13 09:39:27

การสาธิต:

var date = moment.utc().format();
console.log(date, "- now in UTC"); 

var local = moment.utc(date).local().format();
console.log(local, "- UTC now to local"); 
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>


17
ไม่ได้ผลสำหรับฉันเวลายังคง 5 ชั่วโมงก่อนเวลา browers ของฉันซึ่งถูกต้อง
brian Scroggins

หาก momentjs ทราบถึงเขตเวลาท้องถิ่นมีวิธีการดึงข้อมูลหรือเป็น moment.tz.guess () ที่จำเป็นในการดำเนินการนี้
jEremyB

@jEremyB moment().format('Z')และmoment().format('ZZ')สามารถช่วยคุณได้ นอกจากนี้ลองดูที่(new Date()).getTimezoneOffset()มันอาจจะเพียงพอสำหรับคุณ
axon

@brianScroggins .utc(date)ให้แน่ใจว่าจะไม่ลืม ในส่วนแรกบรรทัดที่var local = ...ไม่มีมันอาจทำให้เข้าใจผิดได้
Jocelyn

72

ลองสิ่งนี้:

let utcTime = "2017-02-02 08:00:13";

var local_date= moment.utc(utcTime ).local().format('YYYY-MM-DD HH:mm:ss');

3
การระบุโซนที่บันทึกไว้ใช้งานได้สำหรับฉัน (คำตอบนี้) นอกจากนี้พบว่ามันทำให้ชีวิตง่ายขึ้นหากคุณบันทึกสิ่งต่างๆใน utc อยู่เสมอจากนั้นจัดรูปแบบในฝั่งไคลเอ็นต์
Juan Pablo Ugas

3
สิ่งนี้ใช้ได้ผลในกรณีของฉันที่เราประหยัดเวลาใน UTC ในฐานข้อมูลของเราและแสดงเฉพาะเวลาท้องถิ่นบนไคลเอนต์ ขอบคุณ.
Alex Ehlert

19
let utcTime = "2017-02-02 08:00:13.567";
var offset = moment().utcOffset();
var localText = moment.utc(utcTime).utcOffset(offset).format("L LT");

ลองใช้JsFiddleนี้


2
วิธีนี้ใช้งานได้ดี แต่ทำไม. local () ไม่ส่งคืนผลลัพธ์เดียวกัน
Steve

ซอนี้ส่งคืนผลลัพธ์ต่อไปนี้ในคอมพิวเตอร์ของฉัน: 02/02/2017 8:00 AM (UTC Time) 02/02/2017 10:00 AM (เวลาท้องถิ่น) 02/02/2017 9:00 น. (เวลาท้องถิ่นอีกทางหนึ่ง )
สตีฟ

8

ในการแปลง UTC เป็นเวลาท้องถิ่น

let UTC = moment.utc()
let local = moment(UTC).local()

หรือคุณต้องการรับเวลาท้องถิ่นโดยตรง

let local = moment()

var UTC = moment.utc()
console.log(UTC.format()); // UTC time

var cLocal = UTC.local()
console.log(cLocal.format()); // Convert UTC time

var local = moment();
console.log(local.format()); // Local time
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>


3

หมายเหตุ: โปรดอัปเดตรูปแบบวันที่ให้สอดคล้องกัน

จัดรูปแบบวันที่

   __formatDate: function(myDate){
      var ts = moment.utc(myDate);
      return ts.local().format('D-MMM-Y');
   }

จัดรูปแบบเวลา

  __formatTime: function(myDate){
      var ts = moment.utc(myDate);
      return ts.local().format('HH:mm');
  },

0

ฉันได้สร้างฟังก์ชันหนึ่งที่จะแปลงเขตเวลาทั้งหมดเป็นเวลาท้องถิ่น

ข้อกำหนด:

1. npm i moment-timezone

function utcToLocal(utcdateTime, tz) {
    var zone = moment.tz(tz).format("Z") // Actual zone value e:g +5:30
    var zoneValue = zone.replace(/[^0-9: ]/g, "") // Zone value without + - chars
    var operator = zone && zone.split("") && zone.split("")[0] === "-" ? "-" : "+" // operator for addition subtraction
    var localDateTime
    var hours = zoneValue.split(":")[0]
    var minutes = zoneValue.split(":")[1]
    if (operator === "-") {
        localDateTime = moment(utcdateTime).subtract(hours, "hours").subtract(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
    } else if (operator) {
        localDateTime = moment(utcdateTime).add(hours, "hours").add(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
    } else {
        localDateTime = "Invalid Timezone Operator"
    }
    return localDateTime
}

utcToLocal("2019-11-14 07:15:37", "Asia/Kolkata")

//Returns "2019-11-14 12:45:37"


0

ฉันได้เขียนรหัสแซนด์บ็อกซ์นี้สำหรับการไป - กลับจาก UTC ไปยังเวลาท้องถิ่นและจากเวลาท้องถิ่นถึง UTC คุณสามารถเปลี่ยนเขตเวลาและรูปแบบได้ สนุก!

ตัวอย่างเต็มใน Codesandbox ( DEMO ):

https://codesandbox.io/s/momentjs-utc-to-local-roundtrip-foj57?file=/src/App.js

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