NSDateformatter stringFromDate在iOS 10.3.1模拟程序中返回错误的时间字符串

NSDateformatter stringFromDate在iOS 10.3.1模拟程序中返回错误的时间字符串,ios,objective-c,nsdate,nsdateformatter,Ios,Objective C,Nsdate,Nsdateformatter,我有一个将日期转换为字符串的方法: - (NSString*)getDateTimeBasedOnDeviceTimeFormat:(NSDate *)theDate{ NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; NSDate *dateSource; NSString *dateStr; [dateFormatter setLocale:[NSLocale currentLo

我有一个将日期转换为字符串的方法:

- (NSString*)getDateTimeBasedOnDeviceTimeFormat:(NSDate *)theDate{

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
    NSDate *dateSource;
    NSString *dateStr;

    [dateFormatter setLocale:[NSLocale currentLocale]];
    if (theDate) {
        dateSource = theDate;
    } else {
        dateSource = [NSDate date];
    }

    [dateFormatter setTimeZone:[NSTimeZone systemTimeZone]]; //tried local timezone
    [dateFormatter setDateStyle:NSDateFormatterLongStyle];
    [dateFormatter setTimeStyle:NSDateFormatterShortStyle];

    dateStr = [dateFormatter stringFromDate:dateSource];

    return dateStr;
}
对于iOS 10.3.1:

返回值为2017年10月31日下午2:26时(这是错误的)

对于iOS 11:

返回值为2017年10月31日上午10:26(这是正确的)

两个模拟器具有相同的语言和区域集。英语(美国)

mac日期时间设置:

我不知道为什么这种转换在iOS 10.3.1中出现错误


有人能给我指出一个正确的方向吗?

关于我在测试10.3.1时遇到的问题,您有一个非常类似的问题。在调试dateFormatter时,我注意到模拟器上的时区总是返回为“GMT”。它似乎没有正确使用我的计算机设置

让timeZone=timeZone.current.缩写()//在iOS 10上生成“GMT”,在iOS 11上生成“PDT”


所以我在物理设备上进行了测试,一切都显示正常。我认为这至少是10.3.1模拟人生中的一个苹果模拟器错误造成的。希望这有帮助,我希望你有额外的设备测试

编辑这是一个总结问题的雷达:

我也注意到了这一点,但仅在Mac OS 10.13.1中的所有非11 iOS模拟器上

下面是另一个例子:

import Foundation
let formatterUTC = DateFormatter()
formatterUTC.locale = Locale(identifier: "en_GB")
formatterUTC.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"
formatterUTC.timeZone = TimeZone(abbreviation: "UTC")
let d = formatterUTC.date(from:"2017-07-01T12:00:00Z")

let formatter24 = DateFormatter()
formatter24.locale = Locale(identifier: "en_GB")
formatter24.dateFormat = "HH:mm"
let s = formatter24.string(from:d!) // ⚠️ "12:00" on iOS <= 10.3.1, Mac OS 10.13.1,
                                    //    "13:00" elsewhere! ⚠️
<代码>导入基础 让formatterUTC=DateFormatter() formatterUTC.locale=locale(标识符:“en_GB”) formatterUTC.dateFormat=“yyyy-MM-dd'T'HH:MM:ss'Z'” formatterUTC.timeZone=时区(缩写:“UTC”) 设d=formatterUTC.日期(起始日期:“2017-07-01T12:00:00Z”) let formatter24=DateFormatter() formatter24.locale=locale(标识符:“en_GB”) formatter24.dateFormat=“HH:mm”
设s=formatter24.string(from:d!)//⚠️ iOS上的“12:00”
[dateFormatter setLocale:[NSLocale currentLocale]]是冗余的;这是格式化程序的默认设置。为什么要更改时区?您是否尝试过不使用设置时区的行:
?我认为通过将时区设置为systemTimeZOne,应用程序将调整到设备时区,这样当用户更改时区时,约会的日期转换就不会出现问题。是的,我试过不用那条线,结果是一样的@Tawanicolas添加了时区设置的屏幕截图@rmaddyI相信这两个模拟器共享来自mac的相同时区设置。