我有一个时间戳,表示自 0001 年 1 月 1 日午夜 12:00:00 以来经过的 100 纳秒间隔数(根据http://msdn.microsoft.com/en-us/library/system.日期时间.ticks.aspx)。该值由用 C# 编写的服务器生成,但我需要在 iOS 上将其转换为 Objective-C 中的日期。
例如,时间戳 634794644225861250 应该给出 2012 年 8 月 2 日的日期。
我有一个时间戳,表示自 0001 年 1 月 1 日午夜 12:00:00 以来经过的 100 纳秒间隔数(根据http://msdn.microsoft.com/en-us/library/system.日期时间.ticks.aspx)。该值由用 C# 编写的服务器生成,但我需要在 iOS 上将其转换为 Objective-C 中的日期。
例如,时间戳 634794644225861250 应该给出 2012 年 8 月 2 日的日期。
此 C# 代码可能会对您有所帮助:
// The Unix epoch is 1970-01-01 00:00:00.000
DateTime UNIX_EPOCH = new DateTime( 1970 , 1 , 1 ) ;
// The Unix epoch represented in CLR ticks.
// This is also available as UNIX_EPOCH.Ticks
const long UNIX_EPOCH_IN_CLR_TICKS = 621355968000000000 ;
// A CLR tick is 1/10000000 second (100ns).
// Available as Timespan.TicksPerSecond
const long CLR_TICKS_PER_SECOND = 10000000 ;
DateTime now = DateTime.Now ; // current moment in time
long ticks_now = now.Ticks ; // get its number of tics
long ticks = ticks_now - UNIX_EPOCH_IN_CLR_TICKS ; // compute the current moment in time as the number of ticks since the Unix epoch began.
long time_t = ticks / CLR_TICKS_PER_SECOND ; // convert that to a time_t, the number of seconds since the Unix Epoch
DateTime computed = EPOCH.AddSeconds( time_t ) ; // and convert back to a date time value
// 'computed' is the the current time with 1-second precision.
一旦你有了你的time_t
值,自 Unix 纪元开始以来的秒数,你应该能够在 Objective-C 中获得一个 NSDATE:
NSDate* myNSDate = [NSDate dateWithTimeIntervalSince1970:<my_time_t_value_here> ] ;
在 iOS 上,您不能使用 dateWithString,但您仍然可以轻松地做到这一点。此解决方案应该适用于 iOS 和 Mac。(注意:我在这里输入,未经测试)
@interface NSDate (CLRTicks)
+(NSDate*)dateWithCLRTicks:(long)ticks;
@end
@implementation NSDate (CLRTicks)
+(NSDate*)dateWithCLRTicks:(long)ticks
{
return [NSDate dateWithTimeIntervalSince1970: (ticks-621355968000000000L)/10000000.0]
}
@end
它基本上与 Nicholas 发布的解决方案相同,只是形式更好。您可能应该通过象征性地定义常量来使它变得更好。
为 NSDate 添加一个类别:
@implementation NSDate (CLRTicks)
+ (NSDate *)dateWithCLRTicks:(int64_t)ticks {
return [NSDate dateWithCLRTicks:ticks withTimeIntervalAddition:0.0];
}
+ (NSDate *)dateWithCLRTicks:(int64_t)ticks withTimeIntervalAddition:(NSTimeInterval)timeIntervalAddition {
const double GMTOffset = [[NSTimeZone defaultTimeZone] secondsFromGMT];
const int64_t CLROffset = 621355968000000000;
double timeStamp = ((double)(ticks - CLROffset) / 10000000.0) - GMTOffset + timeIntervalAddition;
return [NSDate dateWithTimeIntervalSince1970:timeStamp];
}
@end
没有做所有的计算,但你的闰年计算不完整。
每 4 年有一个闰年。但是你每 100 年跳过一次。而且您不会每 400 年跳过一次,这就是为什么 2000 年是闰年而 1900 年不是。
例如:
2012 年是闰年(能被 4 整除但不能被 100 整除)2100 不是闰年(能被 100 但不能被 400 整除)2400 是闰年(能被 400 整除)
在可可中,您可以使用 NSDate。
NSDate* reference = [NSDate dateWithString:@"0001-01-01 00:00:00 +0000"];
NSDate* myDate = [NSDate dateWithTimeInterval: (ticks/10000000.0)
sinceDate: reference];