1995 年 3 月 26 日无法使用欧洲/索非亚时区映射到日期

问题描述 投票:0回答:1
使用“欧洲/索非亚”时区时,

DateFomatter
无法从“1995-03-26”字符串初始化日期。我还尝试使用不同的时区,一切正常,但不适用于这个特定的时区。这种奇怪行为的原因是什么?

import Foundation

let serverLocalDateFormatter: DateFormatter = {
    let formatter = DateFormatter()
    
    formatter.locale = Locale(identifier: "en_US_POSIX")
    formatter.dateFormat = "yyyy-MM-d"
    formatter.timeZone = TimeZone(secondsFromGMT: 60 * 60 * 2)
    
    return formatter
}()

let serverLocalDateFormatter2: DateFormatter = {
    let formatter = DateFormatter()
    
    formatter.locale = Locale(identifier: "en_US_POSIX")
    formatter.dateFormat = "yyyy-MM-d"
    formatter.timeZone = TimeZone(identifier: "Europe/Sofia")
    
    return formatter
}()

let testCase1 = "1995-03-26"
let testCase2 = "1995-03-27"
let testCase3 = "1995-03-25"

serverLocalDateFormatter.date(from: testCase1)
serverLocalDateFormatter2.date(from: testCase1)
serverLocalDateFormatter.date(from: testCase2)
serverLocalDateFormatter.date(from: testCase3)

我创建了日期格式化程序,并使用`date(from: String)方法从后端返回的字符串中获取日期,但只能解析一个特定的日期。Playground with bug

swift date nsdateformatter dateformatter
1个回答
0
投票

格式化程序假定字符串表示时间为 00:00:00 的日期,但保加利亚时区中不存在日期时间 1995-03-26T00:00:00,因为 这是保加利亚转换为夏令时的时间1995 年,从 00:00:00 开始“跳过”整整一个小时。

您可以将

isLenient
设置为 true,使其返回 1995 年 3 月 26 日这一天的开始时间,即凌晨 1 点。

formatter.isLenient = true

让格式化程序宽松还允许成功解析其他“格式错误”的日期,例如“1995-03-32”,但由于这似乎正在解析来自服务器的日期,因此这应该不会太重要。

© www.soinside.com 2019 - 2024. All rights reserved.