Как я могу нормализовать хранилища дат, используя разные часовые пояса в XPath? - PullRequest
2 голосов
/ 03 ноября 2010

В XML-документе хранится следующее время, которое соответствует времени, когда документ был создан и затем обновлен:

<create-time>2010-11-04T03:13:35.212Z</create-time>
<update-time>2010-11-03T20:18:26.331-07:00</update-time>

Документ был создан в 20:13, а затем обновлен5 минут спустя, в 8:18 вечера, но когда я показываю даты создания с format-dateTime(xs:dateTime(.), '[M]/[D]/[Y]'), я получаю 04.11.2010 и 03.11.2010, как если бы документ был обновлен за день до его созданиячто, очевидно, не так.Как я могу это исправить?

1 Ответ

3 голосов
/ 03 ноября 2010

create-time и update-time в вашем XML-документе верны, но они используют разные часовые пояса:

  • create-time находится в UTC (также называется временем Зулу, отсюда и Z).
  • update-time по тихоокеанскому времени.

Это может произойти, если разные куски кода устанавливают это время или даже из одного и того же кода, используя разные библиотеки или функции. Например, если вы используете XPath из XForms:

  • Использование current-dateTime() использует часовой пояс из динамического контекста, который часто является текущим часовым поясом для машины, на которой выполняется код.
  • Использование now() всегда возвращает время UTC.

Решением в XPath является использование функции adjust-dateTime-to-timezone(). Это нормализует ваши dateTimes, поэтому они находятся в тех же часовых поясах. Например, в выводе XForms для отображения только части даты create-time вы должны использовать:

<xforms:output value="format-dateTime(adjust-dateTime-to-timezone(xs:dateTime(create-time)), '[M]/[D]/[Y]')">
    <xforms:label>Creation date</xforms:label>
</xforms:output>
...