在Objective-C中将.NET DateTime.Ticks属性转换为Date

时间:2012-08-09 16:41:04

标签: c# .net objective-c ios date

我有一个时间戳,表示自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日的日期。

4 个答案:

答案 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> ] ;

见:https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/Reference/Reference.html

答案 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];