strptime
和strftime
之间有什么区别?我看到strptime
是DateTime
类中的方法,而strftime
是Time
类中的方法。
答案 0 :(得分:55)
Time
和DateTime
之间的差异与实施有关。 DateTime
来自Rails世界,是一个随时间的任意日期。它更像是一个基于日历的系统。 Time
以UTC时间1970年1月1日以来的秒数来衡量,并且与时区无关。在某些系统上,它仅限于1901和2038之间的值,这是传统上将该值存储为带符号的32位整数的限制,但较新版本的Ruby可以使用64位值或BigNum处理更宽的范围根据需要。
简而言之,DateTime
是从Rails中的数据库获得的,其中Time是Ruby传统上使用的。如果您正在处理日期很重要的值,并且您想知道诸如月末或未来六周之类的事情,请使用DateTime。如果您只是测量经过的时间而不关心它,请使用时间。如有必要,它们很容易转换。
Date
只是日历日期,没有任何关联时间。您可能希望在时间不相关的地方使用这些。
strptime
是“解析时间”的缩写,其中strftime
用于“格式化时间”。也就是说,strptime
与strftime
相反,尽管它们使用相同的格式规范。我很少见strptime
,因为DateTime.parse
通常擅长了解正在发生的事情,但如果你真的需要拼写出来,请务必使用旧版解析器。
答案 1 :(得分:4)
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'//结果
答案 2 :(得分:0)
我阅读了上面的答案,它在Ruby中描述Time,DateTime和Date很清楚。
时间与Ruby打包在一起。它以UTC时间1970年1月1日以来的秒数来衡量,并且是时区不可知的。更具体地说,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类一样,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。时间,日期和日期时间都有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')