红宝石;可以解析一个字符串,以便“2016-12-01”是一天,而“2016-12-01T12:05”是一分钟吗?

时间:2016-05-17 20:19:33

标签: ruby parsing datetime

使用vanilla Ruby(或Rails,但更喜欢vanilla Ruby),

假设我们创建了自定义类:YearMonthDayHourMinuteSecond,{{1 }} 对于这些类,它们与特定的小时,分​​钟,秒等有关。

示例:Millisecond


是否可以创建一个函数

thisMinute = Minute.new("2016-12-01T12:05") => Minute 5 of hour 12 of day 1 of month 12 of year 2016可以创建foo("2016")

的实例

Year可以创建foo("2016/12")

的实例

Month可以创建foo("2016-12-01")

的实例

Day可以创建foo("2016-12-01T12:05")

的实例

等等?

以下是陷阱

  • 时间格式可能会有所不同(例如Minute"20161201"

  • 使用这些格式,"20161201@12pm"将成功解析字符串,但会设置Time.parseMonthDay等,以便Hour将为小时设置一个值,即使它应该是"20161201"

  • 检查Day(如== 0中所示)会失败,因为时间可能是Time.parse().hour == 0

1 个答案:

答案 0 :(得分:3)

一种可能的方法是为每个类设置一个解析方法。 stftime用于拉出时间戳的特定部分

a = '2016-12-01T12:05'
=> "2016-12-01T12:05"
b = DateTime.parse(a)
=> #<DateTime: 2016-12-01T12:05:00+00:00 ((2457724j,43500s,0n),+0s,2299161j)>
b.strftime("%M") # minute
=> "05"
b.strftime("%H") # hour
=> "12"
b.strftime("%d") # day of month
=> "01"
b.strftime("%m") # month
=> "12"

所以每个类都会使用不同的stfrtime()参数来过滤到你需要的时间戳的部分内容。

http://apidock.com/ruby/DateTime/strftime