【问题标题】:iOS - Init NSDate with a stringDate without timezone calculationsiOS - 使用没有时区计算的 stringDate 初始化 NSDate
【发布时间】:2015-08-18 09:07:39
【问题描述】:

我从 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。我想稍后执行时区计算

【问题讨论】:

  • 取消注释该时区行并将其设置为 UTC。

标签: ios objective-c swift nsdate nsdateformatter


【解决方案1】:

编辑/更新:

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"
}

【讨论】:

    【解决方案2】:

    默认分配的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)
    

    【讨论】:

    • 默认分配的 NSDateFormatter 将使用当前语言环境(用户在 Settings.app 中设置的语言环境)。与此语言环境相矛盾 UTC 使用公历,没有任何 DST 调整。其实后者是错的。默认情况下,它将使用当前语言环境(本地时间不是 UTC)。您需要指定 secondsFromGMT
    • @LeoDabus 不确定我是否理解其中的矛盾,但是关于与 UTC 的偏移量的错误是一个很好的观点。感谢您指出。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      • 2020-03-05
      • 1970-01-01
      • 2020-05-07
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多