Как правильно использовать GMT на XSLT?

Эти две временные метки, по-видимому, используют разные GMT ​​в XSLT.

Timestamp #1
-> 1559780505287
-> 5/6/2019, 9:21:45 PM GMT-3 (dd/mm/yyyy)

Timestamp #2
-> 1562681762005
-> 9/7/2019, 11:16:02 AM GMT-3 (dd/mm/yyyy)

Использование онлайн-инструмента для тестирования xslt: https://xslttest.appspot.com/

После преобразования временная метка № 1 — 06.06.2019, а временная метка № 2 — по-прежнему 07.09.2019.Отметка времени № 1 должна быть 06.05.2019.

Результат преобразования

Как правильно использовать GMT-3 на XSLT?

XML:

<java version = "1.6.0_45" class = "java.beans.XMLDecoder">
    <object class = "com.MyApp">

        <void property = "date1">
            <object class = "java.util.Date">
                <long>1559780505287</long>
            </object>
        </void>

        <void property = "date2">
            <object class = "java.util.Date">
                <long>1562681762005</long>
            </object>
        </void>

    </object>
</java>

XSLT:

<xsl:stylesheet version = "2.0" 
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" 
xmlns:xs = "http://www.w3.org/2001/XMLSchema" 
xmlns = "http://www.w3.org/TR/xhtml1/strict">
<xsl:decimal-format decimal-separator = "," grouping-separator = "."/>

<xsl:template match = "/">
    <html>
        <head>
            <meta charset = "utf-8"/>
            <meta http-equiv = "X-UA-Compatible" content = "IE=edge"/>
            <meta name = "viewport" content = "width=device-width, initial-scale=1"/>
            <meta name = "format-detection" content = "telephone=no"/>

        </head>
        <body>
            <div class = "container">

                <h1>Date 1</h1>
                <xsl:variable name = "date1">
                    <xsl:value-of select = "xs:date('1970-01-01') + java/object/void[@property='date1'] * xs:dayTimeDuration('PT0.001S')"/>
                </xsl:variable>

                <h2>
                    <xsl:value-of select = "format-date($date1, '[D01]/[M01]/[Y0001]')"/>
                </h2>

                <h1>Date 2</h1>
                <xsl:variable name = "date2">
                    <xsl:value-of select = "xs:date('1970-01-01') + java/object/void[@property='date2'] * xs:dayTimeDuration('PT0.001S')"/>
                </xsl:variable>

                <h2>
                    <xsl:value-of select = "format-date($date2, '[D01]/[M01]/[Y0001]')"/>
                </h2>

            </div>
        </body>
    </html>
</xsl:template>

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
327
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны вычесть время своей эпохи из GMT -3 (3 часа = 10800000 мс), так как ваше преобразование составляет миллисекунды "PT0.001S".

<xsl:stylesheet version = "2.0" 
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" 
xmlns:xs = "http://www.w3.org/2001/XMLSchema" 
xmlns = "http://www.w3.org/TR/xhtml1/strict">
<xsl:decimal-format decimal-separator = "," grouping-separator = "."/>

<xsl:template match = "/">
    <html>
        <head>
            <meta charset = "utf-8"/>
            <meta http-equiv = "X-UA-Compatible" content = "IE=edge"/>
            <meta name = "viewport" content = "width=device-width, initial-scale=1"/>
            <meta name = "format-detection" content = "telephone=no"/>

        </head>
        <body>
            <div class = "container">

                <h1>Date 1</h1>
                <xsl:variable name = "date1">

                     <xsl:value-of select = "xs:date('1970-01-01') + (java/object/void[@property='date1']-10800000) * xs:dayTimeDuration('PT0.001S')"/>
                </xsl:variable>
                <h2>
                    <xsl:value-of select = "format-date($date1, '[D01]/[M01]/[Y0001]')"/>
                </h2>

                <h1>Date 2</h1>
                <xsl:variable name = "date2">
                    <xsl:value-of select = "xs:date('1970-01-01') + (java/object/void[@property='date2']-10800000) * xs:dayTimeDuration('PT0.001S')"/>
                </xsl:variable>

                <h2>
                    <xsl:value-of select = "format-date($date2, '[D01]/[M01]/[Y0001]')"/>
                </h2>

            </div>
        </body>
    </html>
</xsl:template>
</xsl:stylesheet>

Это сработало! Странно... Я вычитал xs:dayTimeDuration('PT3H'), а не 10800000, и временная метка #2 превратилась в 07.08.2019.<xsl:value-of select = "xs:date('1970-01-01') + java/object/void[@property='date2'] * xs:dayTimeDuration('PT0.001S') - xs:dayTimeDuration('PT3H')"/>

Klein 22.07.2019 14:55

pt3h находится в другом часовом поясе.

Ed Bangga 22.07.2019 16:08
Ответ принят как подходящий

Я бы посоветовал вам преобразовать метку времени в дату и время, настроить ее на свой часовой пояс, а затем отформатировать:

XSLT 2.0

<xsl:stylesheet version = "2.0" 
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" 
xmlns:xs = "http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes = "xs">

<xsl:template match = "/java">
    <html>
        <body>
            <xsl:for-each select = "object/void">
                <xsl:variable name = "dateTime-GMT" select = "xs:dateTime('1970-01-01T00:00:00Z') + object/long * xs:dayTimeDuration('PT0.001S')"/> 
                <xsl:variable name = "dateTime-adjusted" select = "adjust-dateTime-to-timezone($dateTime-GMT, xs:dayTimeDuration('-PT3H'))"/>
                <h1>
                    <xsl:value-of select = "@property"/>
                </h1>
                <h2>
                    <xsl:value-of select = "format-dateTime($dateTime-adjusted, '[D01]/[M01]/[Y0001] [h]:[m01]:[s01] [P] [z]')"/>
                </h2>
            </xsl:for-each>
         </body>
    </html>
</xsl:template>

</xsl:stylesheet>

Результат

<html>
   <body>
      <h1>date1</h1>
      <h2>05/06/2019 9:21:45 p.m. GMT-03:00</h2>
      <h1>date2</h1>
      <h2>09/07/2019 11:16:02 a.m. GMT-03:00</h2>
   </body>
</html>

Визуализировано:

для вывода требуется только дата. но это принятое решение включает время. плохо дать этому отрицательный голос.

Ed Bangga 22.07.2019 16:13

Я адаптировал формат, чтобы не включать время: <xsl:value-of select = "format-dateTime($dateTime-adjusted, '[D01]/[M01]/[Y0001]')"/>

Klein 22.07.2019 16:21

@EdBangga На самом деле запрошенный вывод обозначается как -> 5/6/2019, 9:21:45 PM GMT-3. Но если вы считаете, что этот ответ бесполезен, не стесняйтесь голосовать по своему усмотрению.

michael.hor257k 22.07.2019 16:22

Другие вопросы по теме