В XSLT 3.0 вы можете достичь этого, используя аргумент $place
функции format-dateTime()
.Цитирование из спецификации «Функции и операторы» §9.8.4
Если аргумент $ place предоставляется в форме имени часового пояса IANA, которое распознается реализацией, тогда форматируется дата или времяс поправкой на смещение часового пояса, применяемое в этом часовом поясе.Например, если значение xs: dateTime 2010-02-15T12: 00: 00Z отформатировано с аргументом $ place, установленным в America / New_York, то выходные данные будут такими, как если бы значение 2010-02-15T07: 00: 00-05:00 было предоставлено.Эта корректировка учитывает переход на летнее время, где это возможно;если рассматриваемая дата попадает в летнее время в Нью-Йорке, то она корректируется с учетом смещения часового пояса -PT4H, а не -PT5H.Корректировка с использованием перехода на летнее время возможна только в том случае, если значение включает дату, а дата находится в пределах диапазона, охватываемого базой данных часовых поясов.
Обратите внимание, что способ, которым это выражено, дает реализациям возможность«не распознавать» имена часовых поясов;но давайте предположим, что это так.
Прежде всего вам необходимо преобразовать 2019/03/09 14:00
в xs:dateTime
значение 2019-03-09T14:00:00Z
, что представляет собой простой бит манипуляции со строками.
Теперь вы можетеопределите смещение часового пояса для America/New_York
, выполнив format-time(xs:dateTime('2019-03-09T00:00:00'), '[Z]', (), (), 'America/New_York')
, что даст вам значение, например "-05: 00" (в виде строки).Вы можете преобразовать его в dayTimeDuration -PT05H00M
, используя более простые манипуляции со строками, а затем использовать adjustDateTimeToTimezone()
, чтобы применить это смещение к исходному значению даты / времени.
Версия format-dateTime()
для XSLT 2.0 неопределили эту возможность.