61

strptime和有什么区别strftime?我看到这strptime是类中的方法DateTime,并且strftime是类中的方法Time

  1. Time和之间有什么区别DateTime,除了它们有不同的核心方法?Ruby 文档中对类的解释Time很有帮助,但DateTime只是说“日期时间”。还有一个Date类,它说它提供DateDateTime. 帮助我理解这一点。
  2. 我明白strptime了,我想把它发音为“strip time”,但这没有意义。有没有好的助记器?
  3. 到底是什么strptime意思strftime
  4. 你怎么记得哪个做什么?
4

3 回答 3

95

和之间的区别TimeDateTime实施有关。大量DateTime功能来自 Rails 世界,并且是带有一天中时间的任意日期。它更像是一个基于日历的系统。Time以 1970 年 1 月 1 日 UTC 以来的秒数为单位,与时区无关。在某些系统上,它仅限于 1901 到 2038 之间的值,这是传统上将该值存储为有符号 32 位整数的限制,但较新版本的 Ruby 可以使用 64 位值或 BigNum 处理更广泛的范围按要求。

简而言之,DateTime这是您从 Rails 中的数据库获得的,而 Time 是 Ruby 传统上使用的。如果您正在使用日期很重要的值,并且您想知道月底或六周前的哪一天,请使用 DateTime。如果您只是测量经过的时间而不关心它,请使用时间。如有必要,它们很容易转换。

Date另一方面,它只是一个日历日期,没有任何关联的时间。您可能希望在与时间无关的情况下使用这些。

strptime是“解析时间”的缩写,strftime是“格式化时间”的缩写。也就是说,尽管他们使用相同的格式规范,但它们却strptime是相反的。strftime我很少看到strptime使用它,因为DateTime.parse它通常擅长了解正在发生的事情,但如果你真的需要把它拼出来,一定要使用遗留解析器。

于 2013-01-31T06:14:44.037 回答
53

strptime表示字符串解析器,这会将字符串格式转换为日期时间。

例子:-

datetime.strptime('2019-08-09 01:01:01', "%Y-%m-%d %H:%M:%S")

datetime.datetime(2019, 8, 9, 1, 1, 1)//结果

strftime表示字符串格式化程序,这会将日期时间对象格式化为字符串格式。

例子:-

sample_date=datetime.strptime('2019-08-09 01:01:01', "%Y-%m-%d %H:%M:%S")

datetime.strftime(sample_date, "%Y-%d-%m %H:%M:%S")

'2019-09-08 01:01:01'//结果

于 2019-08-08T10:00:21.317 回答
3

我阅读了上面的答案,它在 Ruby 中对时间、日期时间和日期的描述很清楚。

时间是用 Ruby 打包的。它以 1970 年 1 月 1 日 UTC 以来的秒数为单位,与时区无关。更具体地说,Time 类存储整数,表示自 Epoch 以来的秒间隔。我们可以将其视为 Unix 时间。它有一些限制。如果存储为 64 位有符号整数,我在某处读到,它可以表示 1823-11-12 到 2116-02-20 之间的日期,但在我的系统上,它可以表示此范围之外的日期。如果您没有在环境变量 ENV['TZ'] 中指定要使用的时区,那么它将默认为您在类 Unix 系统上的 /etc/localtime 中找到的系统时间。何时使用时间?它对于测量时间流逝或将时间戳插入字符串值很有用。

Rails 实际上扩展了 Time 类。它通过 ActiveSupport::TimeWithZone 实现这一点。它提供对可配置时区的支持。注意 Rails 总是在写入或读取数据库之前将时区转换为 UTC,无论您在配置文件中设置什么时区。换句话说,Rails 的默认行为是以 UTC 格式保存到数据库中的所有时间。

# Get current time using the time zone of current local system or ENV['TZ'] if the latter is set.
Time.now

# Get current time using the time zone of UTC
Time.now.utc

# Get the unix timestamp of current time => 1524855779
Time.now.to_i

# Convert from unix timestamp back to time form
Time.at(1524855779)

# USE Rails implementation of Time! Notice we say Time.current rather than Time.now. This will allow you to use the timezone defined in Rails configuration and get access to all the timezone goodies provided by ActiveSupport::TimeWithZone.
Time.current

TimeWithZone 提供了很多非常有用的辅助方法:

# Get the time of n day, week, month, year ago
1.day.ago
1.week.ago
3.months.ago
1.year.ago

# Get the beginning of or end of the day, week, month ...
Time.now.beginning_of_day
30.days.ago.end_of_day
1.week.ago.end_of_month

# Convert time to unix timestamp
1.week.ago.beginning_of_day.to_i

# Convert time instance to date instance
1.month.ago.to_date

在大多数情况下,来自 Rails 的 ActiveSupport 时区类的 Time 就足够了。但有时你只需要一个约会。

与 Time 类一样,Ruby 与 Date 类一起打包。只需要时间库:

require "time"

Time.parse("Dec 8 2015 10:19")
#=> 2015-12-08 10:19:00 -0200
Date.parse("Dec 8 2015")
#=> #<Date: 2015-12-08>
Time.new(2015, 12, 8, 10, 19)
#=> 2015-12-08 10:19:00 -0200
Date.new(2015, 12, 8)

由于 Date 是 Ruby 的一部分,因此它默认使用类 Unix 系统上 /etc/localtime 中定义的时区,除非您修改 TZ 环境变量。就像 Time 类一样,Rails 扩展了 Date 类。使用 Date.current 而不是 Date.today 来利用 ActiveSupport::TimeWithZone 并使用基于 Rails 的时区配置。

现在还有一个关于日期和时间的课程。DateTime 是 Date 的子类,可以轻松处理日期、小时、分钟、秒和偏移量。它在 Ruby(通过 require 'time')和 Rails(通过 require 'date')中都可用。Rails 使用 TimeZone 功能扩展它,就像使用 Time 类一样。

require 'date'
DateTime.new(2001,2,3,4,5,6) 

我个人认为没有必要在您的应用程序中使用 DateTime,因为您可以使用 Time 本身来表示日期和时间,并且可以使用 Date 来表示日期。

问题的第二部分是关于 strptime 和 strftime。Time、Date 和 DateTime 都有 strptime 和 strftime 方法。strptime 解析给定的字符串表示并创建一个对象。这是一个例子:

> result = Time.strptime "04/27/2018", "%m/%d/%Y"
 => 2018-04-27 00:00:00 -0400 
> result.class
 => Time 

如果您有一个应用程序并且用户提交了一个表单并且您获得了一个日期和/或表示为一个字符串,这将非常有用。在将其保存到数据库之前,您需要将其解析为时间或日期。

strftime 格式化日期或时间。所以你在 Date 或 Time 对象上调用它:

 > Date.current.strftime("%Y-%m-%d")
 => "2018-04-27"

您可以一起使用它们来首先解析用户输入,然后以某种方式对其进行格式化,也许可以输出到 csv 文件中:

 value = Date.strptime(val, '%m/%d/%Y').strftime('%Y-%m-%d')
于 2018-04-27T19:54:16.767 回答