Параметр даты без часовой пояс javascript

Я хочу анализировать дату без часовой пояс в JavaScript. Я пробовал:

new Date(Date.parse("2005-07-08T00:00:00+0000"));

Возвращает Пт Июл 08 2005 02:00:00 GMT + 0200 (Центральноевропейское летнее время)

new Date(Date.parse("2005-07-08 00:00:00 GMT+0000"));

Возвращает тот же результат

new Date(Date.parse("2005-07-08 00:00:00 GMT-0000"));

Возвращает тот же результат

Я хочу проанализировать время:

  • Без часового пояса.

  • Без вызова конструктора Date.UTC или новой даты (год, месяц, день).

  • Просто простая строка в конструкторе Date (без прототипов).

  • Я должен использовать объект Date, а не String.

Ответ 1

Дата анализируется правильно, она просто toString, которая преобразует ее в ваш локальный часовой пояс:

let s = "2005-07-08T11:22:33+0000";
let d = new Date(Date.parse(s));

// this logs for me 
// "Fri Jul 08 2005 13:22:33 GMT+0200 (Central European Summer Time)" 
// and something else for you

console.log(d.toString()) 

// this logs
// Fri, 08 Jul 2005 11:22:33 GMT
// for everyone

console.log(d.toUTCString())

Ответ 2

У меня такая же проблема. Я получаю дату как String, например: '2016-08-25T00: 00: 00', но мне нужно иметь объект Date с правильным временем. Чтобы преобразовать String в объект, я использую getTimezoneOffset:

var date = new Date('2016-08-25T00:00:00')
var userTimezoneOffset = date.getTimezoneOffset() * 60000;
new Date(date.getTime() - userTimezoneOffset);

getTimezoneOffset() возвращает отрицательное или положительное значение эфира. Это должно быть вычтено для работы в любом месте в мире.

Ответ 3

Я столкнулся с одной и той же проблемой, а затем вспомнил что-то неуловимое о проекте, над которым я работал, и о том, как они справились с этой проблемой. В то время я этого не понимал, и мне все равно, пока я не столкнулся с проблемой сам.

var date = '2014-01-02T00:00:00.000Z'
date = date.substring(0,10).split('-')
date = date[1] + '-' + date[2] + '-' + date[0]

new Date(date) #Thu Jan 02 2014 00:00:00 GMT-0600

По какой-либо причине передача даты в качестве "01 -02-2014" устанавливает часовой пояс в ноль и игнорирует часовой пояс пользователя. Это может быть случайностью в классе Date, но она существовала некоторое время назад и существует сегодня. И это похоже на кросс-браузер. Попробуйте сами.

Этот код реализован в глобальном проекте, где временные интервалы имеют большое значение, но человек, смотрящий на дату, не заботился о том, в какой момент он был введен.

Ответ 4

Сам объект Date будет содержать часовой пояс, а возвращаемый результат - это преобразование его в строку по умолчанию. То есть вы не можете создать объект даты без часовой пояс. Но то, что вы можете сделать, это имитировать поведение объекта Date, создав свой собственный. Это, однако, лучше передать в библиотеки, такие как moment.js.

Ответ 5

простое решение

const handler1 = {
  construct(target, args) {
    let newDate = new target(...args);
    var tzDifference = newDate.getTimezoneOffset();
    return new target(newDate.getTime() + tzDifference * 60 * 1000);
  }
};

Date = new Proxy(Date, handler1);

Ответ 6

Пытаясь решить проблему с часовым поясом в объекте даты, мне удалась эта функция синтаксического анализа:

function (itemValue, inputFormat) {
    var value;
    if (typeof itemValue === "string") {
        value = inputFormat ? moment(itemValue, inputFormat, true) : moment(itemValue);
        if (value.isValid && value.isValid()) {
            value = value.toDate();
        }
        else {
            console.error("date convert error for", itemValue, inputFormat);
        }
    }
    else if (typeof itemValue === "object" && itemValue.getTimezoneOffset) value = itemValue;
    else console.error("Date value must be string or date object");
    value.setMinutes(0);
    value.setSeconds(0);
    value.setMilliseconds(0);
    value.setHours(-value.getTimezoneOffset() / 60);
    console.log(value.toLocaleDateString());
    return value;
}

Эта функция дает объект даты с правильными часами в качестве часового пояса, поэтому, когда я запрашиваю value.toLocaleDateString(), я получу правильную дату. Я могу использовать этот синтаксический анализатор для получения даты с любого сервера. Moment library очень полезна для синтаксического анализа даты в любом формате, если вы не предоставляете формат ввода, момент может определить, какой формат, но предпочитает передавать входной формат.

Ответ 7

Просто общая заметка. способ сохранить его гибким.

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

Мы можем использовать getMinutes(), но он возвращает только один номер в течение первых 9 минут.

let epoch = new Date() // Or any unix timestamp

let za = new Date(epoch),
    zaR = za.getUTCFullYear(),
    zaMth = za.getUTCMonth(),
    zaDs = za.getUTCDate(),
    zaTm = za.toTimeString().substr(0,5);

console.log(zaR +"-" + zaMth + "-" + zaDs, zaTm)

Ответ 8

Вы можете использовать этот код

var stringDate = "2005-07-08T00:00:00+0000";
var dTimezone = new Date();
var offset = dTimezone.getTimezoneOffset() / 60;
var date = new Date(Date.parse(stringDate));
date.setHours(date.getHours() + offset);

Ответ 9

Это решение, которое я придумал для этой проблемы, которое работает для меня.


используемая библиотека: моменты с простым классом даты javascript.

Шаг 1. Преобразовать строковую дату в момент объекта (PS: момент сохраняет исходную дату и время, пока не вызван метод toDate()):

const dateMoment = moment("2005-07-08T11:22:33+0000");

Шаг 2. Извлеките значения hours и minutes из ранее созданного объекта момента:

  const hours = dateMoment.hours();
  const mins = dateMoment.minutes();

Шаг 3. Преобразовать момент в дату (PS: это изменит исходную дату в зависимости от часового пояса вашего браузера/компьютера, но не беспокойтесь и прочитайте шаг 4.):

  const dateObj = dateMoment.toDate();

Шаг 4. Вручную установите часы и минуты, извлеченные на шаге 2.

  dateObj.setHours(hours);
  dateObj.setMinutes(mins);

Шаг 5. dateObj теперь будет показывать исходную дату без разницы часовых поясов. Даже изменения летнего времени не будут влиять на объект даты, поскольку мы вручную устанавливаем исходные часы и минуты.

Надеюсь это поможет.

Ответ 10

(new Date().toString()).replace(/\w+-\d+ \(.*\)$/,"")

Это будет выход: Вт 10 июля 2018 19:07:11

(new Date("2005-07-08T11:22:33+0000").toString()).replace(/\w+-\d+ \(.*\)$/,"")

Это будет выход: Пт Июл 08 2005 04:22:33

Примечание. Возвращаемое время будет зависеть от вашего локального часового пояса

Ответ 11

Есть некоторые неотъемлемые проблемы с синтаксисом даты, которые, к сожалению, не исправляются по умолчанию.

-Учитываемые человеком даты имеют скрытый часовой пояс в них
- Существует много широко используемых форматов дат в Интернете, которые неоднозначны

Чтобы решить эти проблемы легко и просто, понадобится такая функция:

>parse(whateverDateTimeString,expectedDatePattern,timezone)
"unix time in milliseconds"

Я искал это, но ничего не нашел!

Итак, я создал: https://github.com/zsoltszabo/timestamp-grabber

Наслаждайтесь!