Ruby 是否有 ISO-8601 日期解析的完整实现?

发布于 2024-09-17 17:45:29 字数 711 浏览 4 评论 0原文

Time.iso8601 方法是 ISO-8601 的受限子集。

  • 它有什么局限性?
  • 有谁知道 Ruby 的完整实现吗?我正在使用 MRI 1.8.7。

更新

看起来没有一个类可以处理所有各种 8601 日期和日期/时间组合。不过,我通过使用 Date.parse 和 Time.iso8601 方法成功解决了这些问题。缺点是您需要在代码中决定输入是否像日期或日期/时间。

警告:时区差异

Time.iso8601Time.parse 的行为不同。

>> Time.parse("2010-09-06T12:27:00.10-05:00")
=> Mon Sep 06 18:27:00 +0100 2010

>> Time.iso8601("2010-09-06T12:27:00.10-05:00")
=> Mon Sep 06 17:27:00 UTC 2010

Time.iso8601 和 ISO-8601 之间的差异

本文档涉及两者之间的差异ISO-8601 以及 Ruby 支持的内容。简而言之,可能的格式数量是有限的。

The Time.iso8601 method is a restricted subset of ISO-8601.

  • What are its limitations?
  • Does anyone know of a full implementation for Ruby? I'm using MRI 1.8.7.

Update

It looks like there isn't a single class that handles all of the various 8601 date and date/time combinations. However, I have managed to work around the problems by using both the Date.parse and Time.iso8601 methods. The downside is that you need to decide in code whether the input looks like a date or a date/time.

Warning : Timezone differences

Time.iso8601 and Time.parse behave differently.

>> Time.parse("2010-09-06T12:27:00.10-05:00")
=> Mon Sep 06 18:27:00 +0100 2010

>> Time.iso8601("2010-09-06T12:27:00.10-05:00")
=> Mon Sep 06 17:27:00 UTC 2010

Differences between Time.iso8601 and ISO-8601

This document touches on the differences between what is in ISO-8601 and what is supported by Ruby. The short answer is that the number of possible formats is restricted.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

许你一世情深 2024-09-24 17:45:29

是的,但不幸的是它是在 Ruby 1.9 中。

require "date"

Date.iso8601("2010-W32-5").strftime
#=> "2010-08-13" 

我不相信 Ruby 1.8.7 有任何实现(或者至少我找不到)。您可以尝试升级到 Ruby 1.9,它从 1.9.2 开始就相当稳定。或者,您可以尝试自己解析日期。

Yes, but unfortunately it's in Ruby 1.9.

require "date"

Date.iso8601("2010-W32-5").strftime
#=> "2010-08-13" 

I don't believe there are any implementations for Ruby 1.8.7 (or at least I couldn't find any). You could either try to upgrade to Ruby 1.9, which is pretty stable as of 1.9.2. Alternatively, you could try to parse the dates yourself.

剪不断理还乱 2024-09-24 17:45:29

要将 ISO8601 日期转换为本地时区,请执行以下操作:

require "time"
dt1 = Time.parse("2010-09-06T12:27:00.10-05:00")

要将 ISO8601 日期转换为 UTC,请执行以下操作:

dt2 = Time.iso8601("2010-09-06T12:27:00.10-05:00")

如果比较上述查询返回的日期,它们将是相同的(即 dt1 === dt2)。但是,访问日期组件(如年、月、日、小时等)将返回适合时区(UTC 或本地)的值。这同样适用于 strftime。

To convert an ISO8601 date into the local time zone, do this:

require "time"
dt1 = Time.parse("2010-09-06T12:27:00.10-05:00")

To convert an ISO8601 date into UTC, do this:

dt2 = Time.iso8601("2010-09-06T12:27:00.10-05:00")

If you compare the dates returned by the above queries, they will be identical (i.e. dt1 === dt2). However, accessing date components (like year, month, day, hour, etc.) will return values appropriate for the time zone (either UTC or local). The same applies to strftime.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文