Момент Js UTC до місцевого часу


145

Я намагаюся перетворити час 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 час. Я живу в Х'юстоні, тому знаю, що це часовий пояс. Я переслідував код за посиланням, але, здається, може отримати місцевий час. Що я роблю неправильно?

Відповіді:


238

Щоб конвертувати час UTC у Local, ви повинні використовувати 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>


16
не працював для мене, час все ще на 5 годин випереджає час мого браузера, що є правильним
Брайан Скроггінс

якщо momentjs знає про місцевий часовий пояс, чи є спосіб його отримати або потрібен для цього moment.tz.guess ()?
jEremyB

@jEremyB, moment().format('Z')і moment().format('ZZ')може вам допомогти. Крім того, погляньте, (new Date()).getTimezoneOffset()можливо, цього вам достатньо
аксон

@brianScroggins, не забудьте .utc(date). У першій частині лінія, var local = ...яка її не має, може ввести в оману.
Джоселін

62

Спробуйте це:

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

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

3
Вказання зони, в якій він був збережений, працював для мене (ця відповідь). Крім того, знайдене полегшує життя, якщо ви завжди зберігаєте речі у форматі utc, а потім у форматі на стороні клієнта.
Хуан Пабло Угас

1
Це спрацювало в моєму випадку, коли ми економимо час у UTC в нашому дБ і відображаємо лише місцевий час на клієнті. Дякую.
Алекс Елерт

18
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 () не повертає однаковий результат?
Стів

ця скрипка повертає такий результат на моєму комп’ютері: 02.02.2017 8:00 (UTC Час) 02.02.2017 10:00 (Місцевий час) 02.02.2017 9:00 (Місцевий час іншим способом )
Стів

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');
  },

3

Для перетворення 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>


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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.