【问题标题】:Conversion of calendar date to Julian date日历日期到儒略日期的转换
【发布时间】:2019-07-03 01:10:59
【问题描述】:

请帮助我使用 xslt 将给定的日历日期转换为儒略日期(YYYYMMM)7 字节格式的代码...

提前致谢!

【问题讨论】:

  • YYYYMMM 不是“儒略日期”。我怀疑您的意思是 JD Edwards 日期格式,即 YYYYDDD,其中 DDD 是一年中的日期。如果是这样,请说明您的处理器支持 XSLT 2.0。
  • 将此日期格式称为“儒略”似乎很常见,例如参见stackoverflow.com/questions/1171208/… - 但它与儒略历(以朱利叶斯凯撒命名)或儒略日数无关Joseph Scaliger 引入的儒略时期和儒略时期。这完全是用词不当。
  • 嘿,非常感谢您的快速回复......是的,它是 YYYYDDD 格式......而且我的处理器不支持任何 XSLt2.0 或日期/时间扩展......所以只有我我正在寻找关于 xslt 中转换的逻辑

标签: xslt julian-date


【解决方案1】:

JD Edwards 日期格式(通常错误地称为 JDE Julian 日期格式)是 CYYDDD 格式,其中:

  • C 是一个表示世纪的数字:0 代表 1900 年到 1999 年之间的年份,1 年代表 2000 年到 2099 年之间的年份,以此类推;
  • YY 表示给定世纪中的年份;
  • DDD 是给定年份的天数。

因此,例如,2019-07-02 的日期将表示为 119183

要使用 XSLT 1.0 将 YYYY-MM-DD 格式的日期转换为 JD Edwards 日期格式,您可以使用:

<xsl:template name="date-to-JDE">
    <xsl:param name="date"/>

    <xsl:variable name="year" select="substring($date, 1, 4)"/>
    <xsl:variable name="month" select="substring($date, 6, 2)"/>
    <xsl:variable name="day" select="substring($date, 9, 2)"/>

    <xsl:variable name="C" select="floor($year div 100) - 19"/>
    <xsl:variable name="YY" select="$year mod 100"/>

    <xsl:variable name="leap" select="not($year mod 4) and $year mod 100 or not($year mod 400)" />
    <xsl:variable name="elapsed-months" select="substring('000031059090120151181212243273304334', 3 * ($month - 1) + 1, 3)"/>
    <xsl:variable name="DDD" select="$elapsed-months + ($month > 2 and $leap) + $day"/> 

    <xsl:value-of select="$C * 100000 + $YY * 1000 + $DDD"/>            
</xsl:template>

演示https://xsltfiddle.liberty-development.net/jyRYYj8


补充:

如果你真的需要YYYYDDD,那么你可以将上面的简化为:

<xsl:template name="date-to-YYYYDDD">
    <xsl:param name="date"/>

    <xsl:variable name="year" select="substring($date, 1, 4)"/>
    <xsl:variable name="month" select="substring($date, 6, 2)"/>
    <xsl:variable name="day" select="substring($date, 9, 2)"/>

    <xsl:variable name="leap" select="not($year mod 4) and $year mod 100 or not($year mod 400)" />
    <xsl:variable name="elapsed-months" select="substring('000031059090120151181212243273304334', 3 * ($month - 1) + 1, 3)"/>
    <xsl:variable name="DDD" select="$elapsed-months + ($month > 2 and $leap) + $day"/> 

    <xsl:value-of select="$year * 1000 + $DDD"/>            
</xsl:template>

【讨论】:

  • 再次感谢您的快速回复。但我正在寻找 YYYYDDD - 7 字节格式。例如,如果给定日期是 1986-01-15 - 需要转换为 1986015。请指导我们。
  • @Teja 如果你想要 YYYYDDD(其中 YYYY 是 4 位数的年份,DDD 是给定年份中的天数),那么只需将最后的 xsl:value-of 更改为 &lt;xsl:value-of select="concat($year, $DDD)"/&gt;跨度>
  • @Tim.. 是的,通过稍微修改并生成了相同的用法。我需要计算一年中的哪一天..所以我从上面的代码中获取了..非常感谢!成功了……
【解决方案2】:

在 XSLT 2.0 中,带有图片 [Y0001][d001] 的 format-date() 应该可以满足您的需求。

如果您不能使用 XSLT 2.0,请查看您的 XSLT 处理器是否支持 www.exslt.org 中定义的日期/时间扩展

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-21
    • 2011-03-02
    • 2021-12-27
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    相关资源
    最近更新 更多