gpt4 book ai didi

ios - IOS NSDateFormatter问题

转载 作者:行者123 更新时间:2023-12-01 18:27:58 26 4
gpt4 key购买 nike

我们正在构建一个需要在设备上存储条目日期的应用程序,该应用程序将是国际性的,因此我们遇到了两个难题。

  • 用户首选项

    如果用户选择12小时制而非24小时制,则我们会从[NSDate date]返回一个类似于2012-07-17 11:26:03 AM的日期,该日期在SQLite数据库中排序不理想,因为我们无法存储作为日期。
  • 用户区域设置

    通常这是可以的,但是在这种情况下,我们有一个很棒的事情,称为英国夏季。会在10月25日至30日的一个周期中增加一小时,并在3月25日至31日的一个周期中删除一小时,因此,如果一年中的8个月未进行任何调整,则时间会延迟一小时。

  • 我需要实现的格式一致的日期是: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);
    }

    最佳答案

    我现在正在做这样的事情。请注意,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

    关于ios - IOS NSDateFormatter问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11520779/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com