XPath选择时区转换后的日期

时间:2011-03-16 15:24:06

标签: php date xpath

使用以下xml

<SomeData>
<MyData uID="123456">
<MyInfo A="1" B="2" C="3">
<Date>2011-10-02 00:30:00</Date>
</MyData>
<MyData uID="123456">
<MyInfo A="1" B="2" C="3">
<Date>2011-10-01 00:30:00</Date>
</MyData>
<SomeData>

我需要能够根据Date的日期部分进行选择。首先,虽然这些日期设置为GMT,但我需要将日期更改为正确的时区,然后选择我需要的日期。

即如果我在2011-10-01寻找日期,但对于GMT-5,我需要xpath来选择第一个日期而不是第二个日期。

我正在使用php,我的代码目前是这样的,但这并没有改变日期。

$results = $this->myxml->xpath("//SomeData[MyData/Date[starts-with(.,'".$searchDate."')]]");

希望这是有道理的。

1 个答案:

答案 0 :(得分:0)

xs:dateTime数据类型不是XPath 1.0数据模型的一部分,时区转换算法很复杂(假设您必须在标准SQL中执行此操作!)。

我的建议:升级到XPath 2.0引擎

作为概念证明,这个样式表:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:template match="/">
        <xsl:copy-of select="
        /SomeData/MyData/Date[
           xs:dateTime(.) >= xs:dateTime('2011-10-01T00:00:00-05:00')
              and
           xs:dateTime('2011-10-02T00:00:00-05:00') > xs:dateTime(.)
        ]"/>
    </xsl:template>
</xsl:stylesheet>

通过这个良好的输入:

<SomeData>
    <MyData uID="123456">
        <MyInfo A="1" B="2" C="3"/>
        <Date>2011-10-02T00:30:00</Date>
    </MyData>
    <MyData uID="123456">
        <MyInfo A="1" B="2" C="3"/>
        <Date>2011-10-01T00:30:00</Date>
    </MyData>
</SomeData>

输出:

<Date>2011-10-02T00:30:00</Date>