【问题标题】:Localize the NSDate and Convert timezone of NSDate本地化 NSDate 并转换 NSDate 的时区
【发布时间】:2015-04-30 10:34:32
【问题描述】:

在我的 iPhone / iPad 应用程序中,我正在显示一个 UIDatePicker 时间。它将以这种格式显示时间,上午 11:00。当用户单击时间行时,我们展开时间行以显示此 datePicker 行。 我在字符串“starts”中有一个时间戳:“11:00”,// ISO-8601 格式的时间 我需要在选择器轮上显示它作为打开时的选定时间。为此,首先我使用https://stackoverflow.com/a/9040554/4082792 获取上午12 点的日期。然后我将给定时间 (11:00) 转换为秒数并将其添加到午夜时间以获取当前时间。这次是本地时区(因为我在使用 NSDateFormatter 时指定了时区)。当我尝试使用此日期将日期设置为 UIDatePicker 时,它给了我不正确的时间,即使 NSDate 变量中的时间是正确的。对于上午 11:00,它给了我 6:40,而当地时间是 4:30。 所以,我有两个问题: 1)为什么车轮上的时间不对。 2) 如何将 NSDate 从一个时区转换为另一个时区,我需要以本地时间格式显示。

片段:

NSString *strDate = @"11:00";
        NSDate *date = [NSDate date];
        NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];
        NSUInteger preservedComponents = (NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit);
        date = [calendar dateFromComponents:[calendar components:preservedComponents fromDate:date]];


        ///Start time
        NSString *startTime = @"11:00";
        NSArray *startTimeSeparatedByColon = [startTime componentsSeparatedByString:@":"]; /// From 22:10 to [22, 10];
        NSInteger hourPartOfStart = startTimeSeparatedByColon[0] ? [startTimeSeparatedByColon[0] integerValue] : 0;
        NSInteger minutePartOfStart = startTimeSeparatedByColon[1] ? [startTimeSeparatedByColon[1] integerValue] : 0;
        NSTimeInterval totalTime = (hourPartOfStart*60*60+minutePartOfStart*60);

        NSDate *finalDate =   [NSDate dateWithTimeInterval:totalTime sinceDate:date];

        NSDate *dt = [NSDate dateWithTimeInterval:[NSTimeZone localTimeZone].secondsFromGMT sinceDate:finalDate];
        self.datePicker.date = dt;

【问题讨论】:

    标签: ios iphone nsdateformatter nstimezone


    【解决方案1】:

    默认情况下,iOS 将日期转换为设备的时区。 但是如果你想把日期转换成另一个时区,下面是代码:

    NSTimeZone *currentDateTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"EST"];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setTimeZone:currentDateTimeZone];
    

    您可以从此 dateFormatter 对象获取“EST”时区的日期。

    【讨论】:

      【解决方案2】:

      转换“EDT”时区

       NSString *format = @"EEEE dd-MMMM-yyyy HH:mm:ss z";
       NSDateFormatter *date_EDTDateFormate = [[NSDateFormatter alloc] init];
       date_EDTDateFormate setDateFormat:format];
       date_EDTDateFormate setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EDT"]];
       NSString *stringEDT = [dateFormatter_EDT stringFromDate:date_System];
      

      【讨论】:

      • 这将返回不能用作 UIDatePicker 上的 NSDate 的 NSString。纠正我,如果我错了。
      • 在您的选择器视图中仅使用数据字符串。
      • 当你想使用日期之后,然后将字符串转换为日期。
      • 那么,它应该是一个字符串数组作为UIDatePicker的数据源?我们会在需要时在 NSString 和 NSDate 之间进行转换。
      • 另外,我怎么知道数组在小时部分的长度是多少,因为它取决于时区,可以是 12 / 24。
      猜你喜欢
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 2020-04-14
      • 2011-07-31
      相关资源
      最近更新 更多