2015-05-19 2 views
0

Может ли кто-нибудь объяснить мне, почему moment("2013-04-22 00:00:00+07:00").date() возвращает 21?MomentJS .date() issue

Например, moment("2013-04-22 00:00:00+02:00").date()22.

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

+0

Вы используете старую версию? Я только что проверил обе эти строки, и для них было равно 21. – chazsolo

+0

Возможный дубликат [Moment.js round date up] (http://stackoverflow.com/questions/28612525/moment-js-round-dates-up) – janfoeh

+0

Думаю, что я понял, chazsolo вижу мой ответ ниже, почему это возвращает 21 для обоих в вашем случае. –

ответ

0

Я думаю, что я понял: moment("iso8601_string") анализирует/преобразует эту строку в локальное время. В моем случае я нахожусь в часовом поясе UTC + 2, поэтому строки синтаксического анализа содержат "+02:00" (или "+01:00"), а затем вызов .date() возвращает 22, потому что время, сохраненное в моментном объекте, совпадает с моим местным временем.

Однако при разборе строки, например. "+07:00", время, сохраненное в объекте момента, будет моим местным временем, и в этом случае дата на самом деле будет отличаться, за день до этого.

Я также считаю, что мое первоначальное требование было свернуто и основано на неправильном допущении. Мой случай использования состоял в том, что я получил datetime из некоторого виджета пользовательского интерфейса всегда, как дата + время, но мне нужна была только дата. Написание единичного теста, который анализировал строку, содержащую "+07:00", заставлял дату быть «неправильной». Однако это было неверное предположение, потому что (по крайней мере, в моем случае использования) datetime из виджета пользовательского интерфейса всегда будет в локальное время, поэтому код никогда не будет анализировать строку, содержащую "+07:00".

Я не уверен, что вариант использования, как я первоначально заявлено не существует в реальном мире:

  • вы получите строку, содержащую дату в другом часовом поясе
  • вам нужно взять дату из-за этого, но в часовом поясе этой даты (почему?)

Я предполагаю, что обычно, когда вы получаете дату откуда-то, удаленное соглашение должно всегда получать UTC, таким образом точка отсчета ясна, и вы можете преобразуйте его дальше локально. Поэтому, вероятно, случай, когда вы получаете дату в случайном часовом поясе и нуждаетесь в дате от нее, в этот часовой пояс, не является обычным явлением. Тем не менее, как академический вопрос, я не знаю, как я смогу получить дату из этого в таком случае :)

+0

Используйте 'parseZone' для создания моментального объекта, который остается в указанном часовом поясе и не преобразован в ваше местное время:' moment.parseZone ("2013-04-22 00: 00: 00 + 07: 00"). get ("date") ' – janfoeh

+0

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