Параметр даты без часовой пояс 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
Наслаждайтесь!