Разбор даты без часового пояса 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"));


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



Я хочу разобрать время:




  1. без часового пояса.


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


  3. просто простая передача строки в конструктор даты (без подходов прототипа).


  4. Я должен продукт Date объект, а не String.


1049   8  

8 ответов:

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

> new Date(Date.parse("2005-07-08T11:22:33+0000"))
Fri Jul 08 2005 13:22:33 GMT+0200 (CEST)
> new Date(Date.parse("2005-07-08T11:22:33+0000")).toUTCString()
"Fri, 08 Jul 2005 11:22:33 GMT"

Javascript Date object-это временные метки - они просто содержат количество миллисекунд с момента эпохи. В объекте даты нет информации о часовом поясе. Какая календарная дата (День, минуты, секунды) эта метка времени представляет собой вопрос интерпретации (один из to...String методов).

приведенный выше пример показывает, что дата анализируется правильно - то есть, он фактически содержит количество миллисекунд, соответствующее "2005-07-08T11:22: 33" в GMT.

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

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

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

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

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, но он существовал некоторое время назад и существует сегодня. И это, кажется, работает кросс-браузерный. Попробуйте сами.

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

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

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

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);

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

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;
}

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

(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

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

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

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

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

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

Я искал, но не нашел ничего подобного!

Так Я создан: https://github.com/zsoltszabo/timestamp-grabber

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

Comments

    Ничего не найдено.