新手问题 关于字符串转换日期的问题

sunsonavaj · 2012年05月16日 · 最后由 feng88724 回复于 2015年04月30日 · 17838 次阅读

大家好: 最近遇到一个需求必须要把字符串’20120514144424‘这个样子的转换为日期如: 2012-05-14 14:44:24 大家有没有好的方法啊。

匿名 #1 2012年05月16日

DateTime.parse('20120514144424').strftime('%Y-%m-%d %H:%M:%S')

谢谢 指导

字符串可以直接转成 Time 对象哦。


>> "20120514144424".to_time.strftime('%Y-%m-%d %H:%M:%S')
=> "2012-05-14 14:44:24"
匿名 #4 2012年05月16日

#3 楼 @zhangyuan 学习了...还是 time 好点啊

#4 楼 @jjym 其实也可以转成 Datetime

>> "20120514144424".to_datetime.strftime('%Y-%m-%d %H:%M:%S')
=> "2012-05-14 14:44:24"

为什么用Time呢? Time 是 unix 时间,在某些平台下有范围。如果超过范围,#to_time 会返回 Datetime 对象,而不是 Time 对象。

多谢 多谢

匿名 #7 2012年05月16日

#5 楼 @zhangyuan 被java/c#这些语言洗脑太久了..首先想到的DateTime..

质疑下超过范围会返回 DateTime 这个 DateTime 的方法好像都是基于'天'的,而 Time 的方法都是基于'秒'的。这个和 Bignum/Fixnum 操作基本相同这点不一样,按照一般的想法应该不会根据范围返回不同类型。还是说我看的书是过时的?DateTime 已经改成'秒'了??求证下

#7 楼 @jjym

Time#to_i 返回的是秒,最多是 (2**31 - 1),超过这个范围就溢出了:

>> Time.at(2**31 - 1)
=> Tue Jan 19 11:14:07 +0800 2038
>> Time.at(2**31)
RangeError: bignum too big to convert into `long'
        from (irb):11:in `at'
        from (irb):11
>> Time.at(2**31 - 1).utc
=> Tue Jan 19 03:14:07 UTC 2038
>> "20380119031407".to_time
=> Tue Jan 19 03:14:07 UTC 2038
>> "20380119031407".to_time.class
=> Time
>> "20380119031408".to_time.class
=> DateTime
>>

所以 String#to_time 的时候,超过 20380119031407 就是 Datetime 了。这个 Rails 干的。

我的电脑是 Linux/32 位,64 位可能最大不是这个。

匿名 #9 2012年05月16日

#8 楼 @zhangyuan 哦,我刚接触 Rails 不太熟,我是认为这样做是隐患啊。如果只是 Rails 这样还好。估计早晚要修复这个。

1.9.3p125 :022 > DateTime.parse('20120514144424') - 1
 => Sun, 13 May 2012 14:44:24 +0000 
1.9.3p125 :023 > Time.parse('20120514144424') - 1
 => 2012-05-14 14:44:23 +0800 

DateTime 和 Time 的基本操作根本就不一样,如果只是显示还好,否则几乎都会有 bug 话说我在这 ubuntu32 位上 9999 年也是 Time....

#3 楼 @zhangyuan

字符串的 to_time 方法?是不是 1.93 才支持啊?

#10 楼 @zw963 rails 里面的,很震撼 ruby 可以直接为字符串类添加方法,哪位高手说说怎么实现的啊

#11 楼 @gaicitadie

晕死。这也会感到震撼?不得不说,你这个问题,对我的震撼绝对要比你强!!

String 是一个类,而且是一个单独实现的类,而且是一个很大很大的类 (Ruby 中的第一大类), 打开这个类,直接添加所需的实例方法就行了。

我怀疑你是不是老把字符串和数组往一块儿想?又或者有更复杂的想法?难以理解...

P.S. 我自己库里面,添加了好多 String 类的方法了。

#12 楼 @zw963 ruby 官方手册刚刚看到 Hash 那一节 -_-|||

#11 楼 @gaicitadie 这在 Ruby 里是很平常的事。你估计都没怎么看 Ruby。

正在看,顺便请教个问题,str[m,n] 可否重写方法,刚才重定义了 slice 好像对 [] 不管用,def [] 又出错,如果可以重定义可否定义这样的方法 str[m:n],谢谢

#15 楼 @gaicitadie 恭喜你 你正在进入 ruby 的魔法世界

#16 楼 @hooopo 瀑布汗啊 -_-|||

都不可以用啊 "201206111804".to_time NoMethodError: undefined methodto_time' for "201206111804":String`

DateTime.parse('20120501000000').strftime('%Y-%m-%d %H:%M:%S') NameError: uninitialized constant DateTime

你需要先require 'date'

最近遇到一个需求必须要把字符串’20120514144424‘这个样子的转换为日期如: 2012-05-14 14:44:24 大家有没有好的方法啊。

如果 数字串类似的话,可以用正则做了,ruby 对字符串处理很 OK, ’‘’ s1=’20120514144424‘ date=s1.scan(/\d{2}/)
ary1=[] ary2=[] ary1<<year=date[0,2].join
ary1<< date[2] ary1<< date[3] year_month=ary1.join('-')

ary2<< date[4] ary2<< date[5] ary2<< date[6]

time=ary2.join(":")

result=year_month+“ ”+time

‘’‘

还有其他解,这是我脑子里的第一个解

Rails 扩展了很多实用方法

需要 登录 后方可回复, 如果你还没有账号请 注册新账号