2

0001 年 1 月 1 日の真夜中の 12:00:00 から経過した 100 ナノ秒間隔の数を表すタイムスタンプがあります ( http://msdn.microsoft.com/en-us/library/system. datetime.ticks.aspx )。この値は C# で記述されたサーバーによって生成されますが、これを iOS の Objective-C で日付に変換する必要があります。

たとえば、タイムスタンプ 634794644225861250 は、2012 年 8 月 2 日の日付を与えることになっています。

4

4 に答える 4

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.

Unix エポックが始まってからの秒数を取得したらtime_t、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

于 2012-08-09T17:57:05.880 に答える
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
于 2013-09-12T15:30:35.443 に答える
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

これは、より良い形式を除いて、Nicholas が投稿したものと基本的に同じソリューションです。定数を記号的に定義することで、おそらくさらに改善する必要があります。

于 2012-08-09T20:11:29.333 に答える
0

すべての計算を行ったわけではありませんが、うるう年の計算は不完全です。

4年ごとに閏年があります。しかし、100 年ごとに 1 つスキップします。また、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];
于 2012-08-09T17:30:00.143 に答える