iOS - 使用不计算时区的 stringDate 初始化 NSDate

iOS - Init NSDate with a stringDate without timezone calculations

我正在从 web 服务 获取日期时间,格式为 UTC。现在我想将它分配给 NSDate。以下是我完成的代码

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
//[dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];

NSDate *utcDate = [dateFormatter dateFromString:@"2015-08-18T23:00:00"];

但它默认计算其时区计算,结果为 2015-08-19 03:00:00 +0000。我如何用相同的日期和时间初始化 NSDate。我想稍后执行时区计算

NSString *dateStr =[NSString stringWithFormat:@"%@",[dict valueForKey:@"utc_datetime"]];

NSString* input = dateStr;
NSString* format = @"dd MMM yyyy - HH:mm:ss'";

// Set up an NSDateFormatter for UTC time zone
NSDateFormatter* formatterUtc = [[NSDateFormatter alloc] init];
[formatterUtc setDateFormat:format];
[formatterUtc setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

// Cast the input string to NSDate
NSDate* utcDate = [formatterUtc dateFromString:input];

// Set up an NSDateFormatter for the device's local time zone
NSDateFormatter* formatterLocal = [[NSDateFormatter alloc] init];
[formatterLocal setDateFormat:format];
[formatterLocal setTimeZone:[NSTimeZone localTimeZone]];

// Create local NSDate with time zone difference
NSDate* localDate = [formatterUtc dateFromString:[formatterLocal stringFromDate:utcDate]];
NSLog(@"utc:   %@", utcDate);
NSLog(@"local: %@", localDate);

NSDateFormatter *format1q = [[NSDateFormatter alloc] init];
format1q.dateFormat = @"HH:mm";


NSString *StrDAte=[NSString stringWithFormat:@"%@",[format1q stringFromDate:utcDate]];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"HH:mm";
NSDate *date = [dateFormatter dateFromString:StrDAte];
date = [date dateByAddingTimeInterval:-60];

dateFormatter.dateFormat = @"hh:mm a";
NSString *pmamDateString = [dateFormatter stringFromDate:date];

默认分配的 NSDateFormatter 将使用当前语言环境(用户在 Settings.app 中设置的语言环境)。

您必须在格式化程序上明确设置合适的语言环境:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];

此区域设置在 UTC 上使用公历,没有任何 DST 调整。

编辑:LeoDabus 指出设置 locale 不会更改日期格式化程序的 timezone。这必须明确地完成:

dateFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)

edit/update:

Xcode 11 • Swift 5.1:

let dateString = "2015-08-18T23:00:00"
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
formatter.calendar = Calendar(identifier: .iso8601)
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0)
if let dateFromString = formatter.date(from: dateString) {
    print(dateFromString)   // "2015-08-18 23:00:00 +0000"
}