1

デバイスにエントリの日付を保存する必要があるアプリを作成しています。アプリは国際的なものになるため、2つのジレンマ/課題に直面します。

  1. ユーザー設定

    ユーザーが24時間形式よりも12時間形式を選択した場合、[NSDatedate]から次のような日付が返されます2012-07-1711:26:03 AM SQLiteデータベースでの並べ替えには、保存できないため最適ではありません日付として。

  2. ユーザーロケール

    通常、これは問題ありませんが、ここでは、英国の夏と呼ばれる素晴らしいものがあります。これは、10月25日から30日までのサイクルで1時間を追加し、3月25日から31日までのサイクルで1時間を削除するため、1年の8か月間調整が行われない場合、時間は1時間遅れます。

私が達成する必要があるのは、次のようにフォーマットされた一貫した日付です:2012-07-17 11:26:03デバイスがどこにあるかに関係なく、GMT+1がどこで行われるかも考慮に入れます。

どんな助けでも素晴らしいでしょう。

編集*

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm";
NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT+01:00"];
[dateFormatter setTimeZone:gmt];
NSString *timeStamp = [dateFormatter stringFromDate:[NSDate date]];
NSDate *localDate = [dateFormatter dateFromString:timeStamp];


NSLocale* currentLocale = [NSLocale currentLocale]; 
NSString* countryCode = [currentLocale objectForKey:NSLocaleCountryCode];
NSLog(@"Country Code: %@", countryCode);
NSLog(@"Current Loacle: %@", currentLocale);
if(([countryCode isEqualToString: @"GB"])){
    NSDate *mydate = [NSDate date];
    NSDate *fiddlyFoo = [mydate dateByAddingTimeInterval:3600];
    NSLog(@"Print GMT +1 %@",fiddlyFoo); 
} else {
    NSLog(@"Print GMT Local   %@",localDate); 
}
4

1 に答える 1

4

私は今このようなことをしています。NSDateは、現在のタイムゾーンや夏時間などを「認識」していることに注意してください。したがって、GMTバージョンの時刻を並べ替え可能な表現で取得する必要があります。RFC 3339をお勧めしますが、必要に応じてバリエーションを使用できます。

このコード:

NSCalendar *gregorian = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];

// Create a local date for London, for testing purposes
NSDateComponents *comps = [NSDateComponents new];
[comps setTimeZone:[NSTimeZone timeZoneWithName:@"Europe/London"]];
[comps setDay:1];
[comps setMonth:7];
[comps setYear:2012];
[comps setHour:14];
NSDate *date = [gregorian dateFromComponents:comps];

// Just want to show this date is 2PM in London July 1st
NSDateFormatter *curFormat = [NSDateFormatter new];
[curFormat setDateStyle:NSDateFormatterFullStyle];
[curFormat setTimeStyle:NSDateFormatterFullStyle];
NSLog(@"Reference date is good no: %@", [curFormat stringFromDate:date]);

// So now we get the date as a rfc3339 string, referenced to GMT
NSString *timeString;
{
    NSDateFormatter *rfc3339 = [NSDateFormatter new];
    [rfc3339 setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
    rfc3339.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
    timeString = [rfc3339 stringFromDate:date];
}
// referenced to UTC (sortable with any other time), can save in SQL DB etc
NSLog(@"Date as rfc3339 string: %@", timeString);

// Now lets convert it back into a BST time
NSDate *newDate;
{
    NSDateFormatter *rfc3339 = [NSDateFormatter new];
    [rfc3339 setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
    rfc3339.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
    newDate = [rfc3339 dateFromString:timeString];

    // we want to show this as a string 2012-07-17 11:26:03
    NSDateFormatter *newFormatter = [NSDateFormatter new];
    [newFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; // local time
    [newFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"Europe/London"]];

    NSLog(@"Local string using 24 hour clock: %@", [newFormatter stringFromDate:newDate]);
}

この出力を生成します。これはあなたが望むものであると私は信じています:

TimeTester[58558:f803] Reference date is good no: Sunday, July 1, 2012 9:00:00 AM Eastern Daylight Time
TimeTester[58558:f803] Date as rfc3339 string: 2012-07-01T13:00:00Z
TimeTester[58558:f803] Local string using 24 hour clock: 2012-07-01 14:00:00
于 2012-07-17T11:44:23.927 に答える