我有这个方法将date转换为string:
- (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日期时间设置:
有人能指出我正确的方向吗?
答案 0 :(得分:2)
编辑以下是一个总结该问题的雷达:Versions of the iOS simulator for anything other than 11.0 and 11.1 use GMT instead of the macOS time zone.
我也注意到了这一点,但仅限 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! ⚠️
答案 1 :(得分:1)
您在测试10.3.1时遇到的问题非常类似。在调试我的dateFormatter时,我注意到模拟器上的时区总是回到&#34; GMT&#34;。它似乎没有正确使用我的电脑设置。
让timeZone = TimeZone.current.abbreviation()//生成&#34; GMT&#34;在iOS 10和&#34; PDT&#34;在iOS 11上
所以我在物理设备上进行了测试,所有内容都正常显示。我至少在10.3.1 sims上将这个问题归咎于Apple Simulator的bug。希望这有所帮助,我希望你有额外的设备可以测试!