我有一个时间戳,表示自0001年1月1日午夜12:00(根据http://msdn.microsoft.com/en-us/library/system.datetime.ticks.aspx)以来经过的100纳秒间隔的数量。此值由使用C#编写的服务器生成,但我需要将其转换为iOS上Objective-C中的日期。
例如,时间戳634794644225861250应该给出2012年8月2日的日期。
答案 0 :(得分:5)
这个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> ] ;
答案 1 :(得分:1)
在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
除了更好的形式外,它基本上与尼古拉斯发布的解决方案相同。你应该通过象征性地定义常量来使它变得更好。
答案 2 :(得分:1)
为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
答案 3 :(得分:0)
没有完成所有计算,但是你的闰年计算是不完整的。
你每4年获得一次闰年。但是你每100年就跳过一次。并且你不会每400跳过它,这就是为什么2000年是闰年,但1900年不是。
例如:
2012年是闰年(可被4整除但不是100) 2100不是闰年(可被100整除但不能被400整除) 2400是闰年(可分400)
在cocoa中你可以使用NSDate。
NSDate* reference = [NSDate dateWithString:@"0001-01-01 00:00:00 +0000"];
NSDate* myDate = [NSDate dateWithTimeInterval: (ticks/10000000.0)
sinceDate: reference];