2015-08-17 2 views
3

Я преобразование этого кода из C# в Ruby:Как преобразовать целое число без знака 64-разрядного целого числа

C# код

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

Рубин Код

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-битное целое число. Действительно ли распаковка действительно подходит?

+0

'распаковка' - это не ваша вещь. 'Time.now.to_i' будет достаточно. – Aetherus

+0

@Aetherus time_diff = ((сейчас - эпоха) .to_i) .to_s нравится это? – olleh

+2

Вам не нужна «эпоха», так как рубин всегда хранит время как секунды с эпохи. – Aetherus

ответ

0

Одним словом, Time.now.to_i достаточно.

Рубин внутренне сохраняет Time с в секундах с 1970-01-01T00:00:00.000+0000:

Time.now.to_f #=> 1439806700.8638804 
Time.now.to_i #=> 1439806700 

И вы не должны преобразовать значение что-то вроде ulong в C#, потому что рубин автоматически принуждают целочисленного типа, так что Безразлично» т борьба против вашего общего.

Немного многословное объяснение: рубин хранит целые числа как экземпляры Fixnum, если это число соответствует размеру 63-разрядный (не 64-бит, странно да?) Если это число превышает этот размер, рубин автоматически преобразует его в Bignum , который имеет произвольный размер.

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

Это самый простой и правильный ответ. – jayands

Смежные вопросы