2010-08-12 37 views
10

Tengo una variable dateTime, y quiero convertirla a un valor decimal de epoch. ¿Cómo se puede hacer esto?Convertir dateTime a unix epoch en xslt

He intentado utilizar:

seconds-from-duration($time, xs:dateTime('1970-01-01T00:00:00')) 

pero simplemente devuelve 0.

consejos favor. Gracias.

+0

¿Cómo se define '" época "'? –

+0

La respuesta a tu pregunta es: '0'. seconds-from-duration() solo extrae el valor del componente de segundos de la xs incluida: duración. Obviamente, desea convertir la duración a todos los segundos y luego calcular cualquier "época". Por favor, corrige tu pregunta. –

+0

Consulte lo siguiente para obtener una definición de época: http://en.wikipedia.org/wiki/Unix_time. Básicamente, es la cantidad de segundos desde 1/1/1970 (UTC) – Anna

Respuesta

13

Esta transformación:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:sequence select="current-dateTime()"/> 

    <xsl:sequence select= 
    "(current-dateTime() - xs:dateTime('1970-01-01T00:00:00')) 
    div 
    xs:dayTimeDuration('PT1S') 
    "/> 
</xsl:template> 
</xsl:stylesheet> 

cuando se aplica en cualquier documento XML (no se utiliza), produce el resultado deseado - la fecha actual en tiempo y su época Unix (el número de segundos desde el 1 de/1/1970):

2010-08-12T06:26:54.273-07:00 1281594414.273 
+1

Esto es genial! funciona como magia Muchas gracias. – Anna

+1

+1 para dividir por xs: duración (estaba extrayendo cada componente, por lo que he eliminado la respuesta). Pero sigo pensando si ** la zona horaria ** se define para * nix epoch. –

+1

+1 para una respuesta clara y concisa. Muy ordenado. – tatlar

0

Como un XPath que no utiliza división pero extractos de la duración:

for $i in (current-dateTime()-xs:dateTime('1970-01-01T00:00:00Z')) 
    return ((days-from-duration($i)*86400)+(hours-from-duration($i)*3600)+(minutes-from-duration($i)*60)+(seconds-from-duration($i))) 
4

A pure xsl 1.0 lib ejemplo:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:date="https://github.com/ilyakharlamov/pure-xsl/date" 
    version="1.0"> 
    <xsl:import href="https://raw.github.com/ilyakharlamov/pure-xsl/master/date.xsl"/> 
    <xsl:template match="/"> 
     <xsl:variable name="time_as_timestamp" select="1365599995640"/> 
     <xsl:text>time_as_timestamp:</xsl:text><xsl:value-of select="$time_as_timestamp"/><xsl:text>&#x0A;</xsl:text> 
     <xsl:variable name="time_as_xsdatetime"> 
      <xsl:call-template name="date:date-time"> 
       <xsl:with-param name="timestamp" select="$time_as_timestamp"/> 
      </xsl:call-template> 
     </xsl:variable> 
     <xsl:text>time_as_xsdatetime:</xsl:text><xsl:value-of select="$time_as_xsdatetime"/><xsl:text>&#x0A;</xsl:text> 
     <xsl:text>converted back:</xsl:text> 
     <xsl:call-template name="date:timestamp"> 
      <xsl:with-param name="date-time" select="$time_as_xsdatetime"/> 
     </xsl:call-template> 
    </xsl:template> 
</xsl:stylesheet> 

de salida:

time_as_timestamp: 1365599995640
time_as_xsdatetime: 2013-04-10T13: 19: 55.640Z
convierte de nuevo: 1365599995640

+0

Teniendo en cuenta que LibXML2 _still_ no es compatible con las funciones de XPath 2.0 - en * 20-freaking-15 * - esta respuesta es increíble y me ahorró muchísimo tiempo. ¡Gracias! – aendrew