Xslt преобразование для dateTime в другом часовом поясе с экономией дневного света - PullRequest
0 голосов
/ 22 апреля 2019

Нужна помощь по конвертации xslt для dateTime в другом часовом поясе с сохранением дневного света.Как обрабатывать EST против EDT при выполнении преобразования dateTime в xslt?

введите код здесь

Below is one Sample order xml which will be converted into another order format <salesOrders> using xslt. 
All dates in the "salesOrders" are supposed to be stored in GMT timezone. 

<!-- Input orders xml -->
<xml>
    <orders>
        <order>
            <order_id>1</order_id>
            <!--lots of other details -->
            <order_dateTime>2019/03/09 14:00</order_dateTime> <!-- yyyy/MM/dd hh24:mm-->
            <order_timezone>America/New_York</order_timezone>
            <!-- This time does not fall under day light saving ( UTC -0500) -->
        </order>
        <order>
            <order_id>2</order_id>
            <!--lots of other details -->
            <order_dateTime>2019/03/10 14:00</order_dateTime>
            <order_timezone>America/New_York</order_timezone>
            <!-- This time falls under day light saving timing ( UTC -0400) -->
        </order>
        <order>
            <order_id>3</order_id>
            <!--lots of other details -->
            <order_dateTime>2019/03/10 14:00</order_dateTime>
            <!-- format : yyyy/MM/dd hh24:mm-->
            <order_timezone>Asia/Kolkata</order_timezone>
            <!-- Indian Standard Time ( UTC +0530) -->
        </order>
    </orders>
</xml>

<!-- after xslt conversion, the date should be converted as given below.  -->

<xml>
    <salesOrders>
        <salesOrder>
            <salesOrderId>1</salesOrderId>
            <!-- required details -->
            <salesOrderDttm>2019-03-09T19:00:00</salesOrderDttm>    <!-- (14 + 5:00) -->
            <!-- converted the time into GMT (-04:30)-->
        </salesOrder>
        <salesOrder>
            <salesOrderId>2</salesOrderId>
            <!-- required details -->
            <salesOrderDttm>2019-03-09T18:00:00</salesOrderDttm>  <!-- (14 + 4:00) -->
            <!-- converted the time into GMT (-05:30)-->    
        </salesOrder>
        <salesOrder>
            <salesOrderId>2</salesOrderId>
            <salesOrderDttm>2019-03-09T08:30:00</salesOrderDttm>  <!-- (14 - 5:30) -->
        </salesOrder>
    </salesOrders>
</xml>

Need help for pupulating content of "salesOrderDttm"
    The content of <orderDateTime> and <orderTimeZone> will be used to populate <salesOrderDttm>.
    As mentioned above, it will be maintained in GMT (offset +0000) timezone.
    The main problem is, same Time zone being treated differently. At one time(first order), offset is +5:00 and at another time(2nd order) the offset is +04:30 

    How to do it in xslt?
    Came across adjust-dateTime-to-timezone() function, but that also expects us to provide the offset. 
    Is there any way to handle it?
    I hope this is a very common problem and must be solved 

Видел этот пост, но все, что он говорит, не возможно, что я ищу. Аналогичный запрос при переполнении стека

1 Ответ

3 голосов
/ 22 апреля 2019

В 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 неопределили эту возможность.

...