本地化NSDate的NSDate和转换时区

时间:2015-04-30 10:34:33

标签: ios iphone nsdateformatter nstimezone

在我的iPhone / iPad应用程序中,我正在显示UIDatePicker。它将以此格式显示时间,上午11:00。当用户点击时间行时,我们展开时间行以显示此datePicker行。 我有一个时间戳在字符串“开始”:“11:00”,// ISO-8601格式的时间 我需要在拣货轮上将其显示为打开时的选定时间。为此,首先我使用https://stackoverflow.com/a/9040554/4082792在上午12点获取日期。然后我将给定时间(11:00)转换为秒数并将其添加到午夜时间以获得当前时间。这个时间是在本地时区(因为我在使用NSDateFormatter时指定了时区)。当我尝试使用此日期将日期设置为UIDatePicker时,即使NSDate变量中的时间正确,它也会给我不正确的时间。上午11点,它给我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;

2 个答案:

答案 0 :(得分:0)

默认情况下,iOS会将日期转换为设备的时区。 但是,如果您想将日期转换为另一个时区,请输入以下代码:

Skobbler

您可以在" EST"中获取日期来自此dateFormatter对象的时区。

答案 1 :(得分:0)

转换“EDT” TimeZone

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