大家好: 最近遇到一个需求必须要把字符串’20120514144424‘这个样子的转换为日期如: 2012-05-14 14:44:24 大家有没有好的方法啊。
字符串可以直接转成 Time 对象哦。
>> "20120514144424".to_time.strftime('%Y-%m-%d %H:%M:%S')
=> "2012-05-14 14:44:24"
>> "20120514144424".to_datetime.strftime('%Y-%m-%d %H:%M:%S')
=> "2012-05-14 14:44:24"
为什么用Time
呢? Time
是 unix 时间,在某些平台下有范围。如果超过范围,#to_time
会返回 Datetime
对象,而不是 Time
对象。
#5 楼 @zhangyuan 被java/c#这些语言洗脑太久了..首先想到的DateTime..
质疑下超过范围会返回 DateTime 这个 DateTime 的方法好像都是基于'天'的,而 Time 的方法都是基于'秒'的。这个和 Bignum/Fixnum 操作基本相同这点不一样,按照一般的想法应该不会根据范围返回不同类型。还是说我看的书是过时的?DateTime 已经改成'秒'了??求证下
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 位可能最大不是这个。
#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....
晕死。这也会感到震撼?不得不说,你这个问题,对我的震撼绝对要比你强!!
String 是一个类,而且是一个单独实现的类,而且是一个很大很大的类 (Ruby 中的第一大类), 打开这个类,直接添加所需的实例方法就行了。
我怀疑你是不是老把字符串和数组往一块儿想?又或者有更复杂的想法?难以理解...
P.S. 我自己库里面,添加了好多 String 类的方法了。
正在看,顺便请教个问题,str[m,n] 可否重写方法,刚才重定义了 slice 好像对 [] 不管用,def [] 又出错,如果可以重定义可否定义这样的方法 str[m:n],谢谢
都不可以用啊
"201206111804".to_time
NoMethodError: undefined method
to_time' for "201206111804":String`
DateTime.parse('20120501000000').strftime('%Y-%m-%d %H:%M:%S')
NameError: uninitialized constant DateTime
最近遇到一个需求必须要把字符串’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
‘’‘
还有其他解,这是我脑子里的第一个解