如何将整数转换为无符号64位整数

3

I'm converting this code from C# to Ruby:

C# Code

DateTime dtEpoch = new DateTime(1970, 01, 01, 0, 0, 0, 0, DateTimeKind.Utc); 
string strTimeStamp = Convert.ToUInt64((DateTime.UtcNow - dtEpoch).TotalSeconds).ToString();

Ruby代码

now = Time.now.utc
epoch = Time.utc(1970,01,01, 0,0,0)
time_diff = ((now - epoch).to_s).unpack('Q').first.to_s            

我需要将整数转换为无符号的64位整数。使用unpack是正确的方法吗?


“unpack” 不是你的菜。使用 “Time.now.to_i” 就足够了。 - Aetherus
@Aetherus 时间差 = ((现在 - 纪元).to_i).to_s 这样可以吗? - olleh
2
你不需要使用“epoch”,因为Ruby始终将时间存储为自纪元以来的秒数。 - Aetherus
你不必这样做,因为Ruby会自动强制转换整数类型,以避免与你的常识相冲突。 - Aetherus
2
稍微详细解释一下:Ruby将整数存储为Fixnum实例,如果该数字适合63位大小(不是64位,很奇怪吧?)如果该数字超过该大小,则Ruby会自动将其转换为具有任意大小的Bignum - Aetherus
显示剩余2条评论
2个回答

2
我不确定你的代码返回值是什么,但它肯定不是自纪元以来的秒数。
Ruby在内部将日期和时间存储为自纪元以来的秒数。使用Time.now.to_i可以精确地返回你要查找的值。
require 'date'

# Seconds from epoch to this very second
puts Time.now.to_i

# Seconds from epoch until today, 00:00
puts Date.today.to_time.to_i

0
简而言之,Time.now.to_i足够了。
Ruby在内部以自1970年01月01日00:00:00.000+0000以来的秒数存储Time
Time.now.to_f  #=> 1439806700.8638804
Time.now.to_i  #=> 1439806700

你不需要在C#中将值转换为类似于ulong的类型,因为Ruby会自动强制整数类型,以使其与你的常识保持一致。
稍微啰嗦地解释一下:Ruby将整数存储为Fixnum的实例,如果该数字适合63位大小(不是64位,很奇怪对吧?)如果该数字超过了这个大小,Ruby会自动将其转换为一个具有任意大小的Bignum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接