2016-08-26 2 views
0

Я живу в Австралии, и в то время как new Date() дать мне текущую дату и время в Австралии, например Fri Aug 26 2016 09:16:16 GMT+1000 (AUS Eastern Standard Time) , если я пишу new Date().toJSON() я получаю 2016-08-25T23:20:08.242Z, , как я могу получить в том же формате, что и в yyyy-mm-ddThh:mn:ss, но сохраняя мой местный день и время, то есть он должен быть 26, а не 25-м.Javascript Дата toJSON() выводит неправильную дату

Edit: когда я пишу программно new Date(2016, 11, x) с var x = 31, используя toJSON() У меня нет никакой гарантии, чтобы увидеть на экране 2016-12-31 из-за часовых поясов, поэтому было интересно, есть другая функция, которая Javascript даст мне желаемого результата.

+0

'Date.prototype.toJSON = Date.prototype.toString' –

+0

Дата не является неправильной, она находится в UTC. Без информации о часовом поясе 'yyyy-mm-ddThh: mn: ss' не имеет смысла. – Blender

+0

Возможный дубликат [Где я могу найти документацию по форматированию даты в JavaScript?] (Http://stackoverflow.com/questions/1056728/where-can-i-find-documentation-on-formatting-a-date-in -javascript) – Jasen

ответ

1

Я использовал бы для этого момент moment.js.

var date = moment("Fri Aug 26 2016 09:16:16 GMT+1000"); 
console.log(moment(date).format('YYYY-MM-DD T hh:mm:ss')); 

https://jsfiddle.net/Refatrafi/ys4nu8o9/

+0

Почему это было опущено? – zerkms

+0

Спасибо, но добавление целой библиотеки для этого кажется немного выше. – Bondifrench

+0

@Bondifrench «сверху» по сравнению с * what *? У вас есть простое альтернативное решение? – zerkms

0

toJSON() возвращает временные метки в формате ISO 8601. Z в конце строки означает, что используется UTC. Объекты даты в ECMAScript являются внутренними UTC. Спецификация Date.prototype.toJSON говорит, что использует Date.prototype.toISOString, в котором говорится, что «часовой пояс всегда UTC».

+0

Хотя это заставляет меня понять разницу, она не говорит мне, как реализовать переход от одного к другому. – Bondifrench

0

Дата не является неправильной, она находится в UTC. Без информации о часовом поясе yyyy-mm-ddThh:mn:ss не имеет смысла, если вы явно не хотите считать, что он находится в часовом поясе AEST.

Если вы передаете дату в виде строки, которая будет обрабатываться в виде какого-то объекта Date-like позже (например, вашим веб-сервером), вам нечего делать. 2016-08-25T23:20:08.242Z однозначно относится к тому же моменту времени независимо от того, что вы используете для его анализа.

Если вы пытаетесь отформатировать объект даты и отобразить его где-нибудь, вы можете извлечь различные части Date объекта и создать представление вы хотите:

function format_date(d) { 
    var pretty_date = [d.getFullYear(), d.getMonth() + 1, d.getDate()].join('-'); 
    var pretty_time = [d.getHours(), d.getMinutes(), d.getSeconds()].join(':'); 

    return pretty_date + 'T' + pretty_time; 
} 

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

+0

В конце дня я намереваюсь, когда я пишу программно 'new Date (2016, 11, 31)', с годами, месяцами и датой, являющимися переменными, а затем выполняю преобразование к нему, я получаю взамен ' 2016-12-31', что 'toJSON()' почти делает, но в зависимости от времени дня, иногда я получаю '2016-12-30', что не то, что я хочу отображать. – Bondifrench

+0

@Bondifrench: 'toJSON()' не собирается делать то, что вы хотите. Вам нужно написать свою собственную функцию для создания форматированной даты. – Blender

Смежные вопросы