Эти две временные метки, по-видимому, используют разные 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>





Вы должны вычесть время своей эпохи из 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>
pt3h находится в другом часовом поясе.
Я бы посоветовал вам преобразовать метку времени в дату и время, настроить ее на свой часовой пояс, а затем отформатировать:
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>
Визуализировано:
для вывода требуется только дата. но это принятое решение включает время. плохо дать этому отрицательный голос.
Я адаптировал формат, чтобы не включать время: <xsl:value-of select = "format-dateTime($dateTime-adjusted, '[D01]/[M01]/[Y0001]')"/>
@EdBangga На самом деле запрошенный вывод обозначается как -> 5/6/2019, 9:21:45 PM GMT-3. Но если вы считаете, что этот ответ бесполезен, не стесняйтесь голосовать по своему усмотрению.
Это сработало! Странно... Я вычитал 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')"/>