2010-08-12 18 views
10

Tôi có biến dateTime và tôi muốn chuyển đổi nó thành giá trị thập phân của kỷ nguyên. Làm cách nào để thực hiện điều này?Chuyển đổi dateTime thành unix epoch trong xslt

tôi đã cố gắng sử dụng:

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

nhưng nó chỉ trả về 0.

lời khuyên hãy. Cảm ơn.

+0

"Epoch" được định nghĩa như thế nào? –

+0

Câu trả lời cho câu hỏi của bạn là: '0'. seconds-from-duration() chỉ trích xuất giá trị của thành phần giây từ thời gian xs: được cung cấp. Bạn rõ ràng muốn chuyển đổi thời lượng cho tất cả các giây và sau đó để tính toán bất cứ "thời đại" nào có thể. Vui lòng sửa câu hỏi của bạn. –

+0

Xem phần sau đây để biết định nghĩa epoch: http://en.wikipedia.org/wiki/Unix_time. Về cơ bản, đó là số giây từ 1/1/1970 (UTC) – Anna

Trả lời

13

chuyển đổi này:

<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> 

khi áp dụng trên bất kỳ tài liệu XML (không sử dụng), tạo ra kết quả mong muốn - dòng điện ngày-thời gian và kỷ nguyên Unix của nó (số giây kể từ khi 1/1/1970):

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

Điều này thật tuyệt! hoạt động như ma thuật. Cảm ơn rất nhiều. – Anna

+1

+1 để chia cho xs: duration (Tôi đã trích xuất từng thành phần, vì vậy tôi đã xóa câu trả lời). Nhưng tôi tiếp tục suy nghĩ nếu ** múi giờ ** được định nghĩa cho * nix epoch. –

+1

+1 để có câu trả lời ngắn gọn rõ ràng. Rất gọn gàng. – tatlar

0

là một xpath mà không sử dụng bộ phận nhưng chiết xuất từ ​​thời gian:

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

Một pure xsl 1.0 lib dụ:

<?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> 

Output:

time_as_timestamp: 1365599995640
time_as_xsdatetime: 2013-04-10T13: 19: 55.640Z
chuyển đổi trở lại: 1365599995640

+0

Xét rằng LibXML2 _still_ không hỗ trợ các chức năng XPath 2.0 - trong * 20-freaking-15 * - câu trả lời này là tuyệt vời và hoàn toàn tiết kiệm cho tôi một lượng thời gian. Cảm ơn! – aendrew