无法从此特定日期 (1994-04-01) String 转换为 NSDate
Cannot convert to NSDate from this specific date (1994-04-01) String
我遇到了一些奇怪的事情。
我无法转换此特定日期 (1994-04-01) 字符串。
谁能检查一下并让我知道它是否在您的代码中重现?
重现步骤:
Swift:-
let dateString = "1994-04-01"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let dateFromString = dateFormatter.date(from: dateString)
目标 c:-
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:@"yyyy-MM-dd"];
NSString *birthdayStr = @"1994-04-01";
NSDate *birthday = [formatter dateFromString:birthdayStr];
预期结果:
birthday = 1994-03-31 21:00:00 +0000
UTC
实际结果:
birthday = nil
版本:
Xcode 版本:- 版本 8.1 (8B62)
OS X 版本:- 10.12.1 (16B2555)
您可以尝试任何不同的日期 (1994-04-01),它会正常工作。
测试代码:
import Foundation
for timeZoneId in TimeZone.knownTimeZoneIdentifiers {
let dateString = "1994-04-01"
let dateFormatter = DateFormatter()
dateFormatter.timeZone = TimeZone(identifier: timeZoneId)
dateFormatter.dateFormat = "yyyy-MM-dd"
if dateFormatter.date(from: dateString) == nil {
print(timeZoneId)
}
}
输出:
Asia/Amman
Asia/Damascus
Asia/Gaza
Asia/Hebron
Asia/Jerusalem
我断定您的系统时区设置为打印的时区之一。如果我在 Google 中输入“jerusalem time zone 1994”,the first result 会告诉我夏令时从 1994 年 4 月 1 日的午夜开始。这意味着没有午夜。 1994 年 4 月 1 日的第一个时刻实际上是该时区的凌晨 1 点。
A DateFormatter
在不从字符串解析时间时默认使用午夜时间。当字符串中的日期不存在午夜时,这会使它失败。
解决方案是不要将午夜用作一天中的默认时间。中午是一个更安全的默认时间。因此,一种解决方案是在输入中包含一天中的时间并以以下格式解析它:
let dateString = "1994-04-01 12:00:00"
let dateFormatter = DateFormatter()
dateFormatter.timeZone = TimeZone(identifier: timeZoneId)
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
另一种解决方案是为日期格式化程序提供一个默认日期,即某一天的中午:
// Reference date was 00:00:00 UTC on 1 January 2001. This is noon of the same day in UTC.
dateFormatter.defaultDate = Date(timeIntervalSinceReferenceDate: 12*60*60)
如果您要在 iOS 或 macOS 上进行任何日期解析或操作,非常 观看 WWDC 2013 Session 227: Solutions to Common Date and Time Challenges 是个好主意。
我遇到了一些奇怪的事情。 我无法转换此特定日期 (1994-04-01) 字符串。 谁能检查一下并让我知道它是否在您的代码中重现?
重现步骤:
Swift:-
let dateString = "1994-04-01"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let dateFromString = dateFormatter.date(from: dateString)
目标 c:-
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:@"yyyy-MM-dd"];
NSString *birthdayStr = @"1994-04-01";
NSDate *birthday = [formatter dateFromString:birthdayStr];
预期结果:
birthday = 1994-03-31 21:00:00 +0000
UTC
实际结果:
birthday = nil
版本:
Xcode 版本:- 版本 8.1 (8B62)
OS X 版本:- 10.12.1 (16B2555)
您可以尝试任何不同的日期 (1994-04-01),它会正常工作。
测试代码:
import Foundation
for timeZoneId in TimeZone.knownTimeZoneIdentifiers {
let dateString = "1994-04-01"
let dateFormatter = DateFormatter()
dateFormatter.timeZone = TimeZone(identifier: timeZoneId)
dateFormatter.dateFormat = "yyyy-MM-dd"
if dateFormatter.date(from: dateString) == nil {
print(timeZoneId)
}
}
输出:
Asia/Amman
Asia/Damascus
Asia/Gaza
Asia/Hebron
Asia/Jerusalem
我断定您的系统时区设置为打印的时区之一。如果我在 Google 中输入“jerusalem time zone 1994”,the first result 会告诉我夏令时从 1994 年 4 月 1 日的午夜开始。这意味着没有午夜。 1994 年 4 月 1 日的第一个时刻实际上是该时区的凌晨 1 点。
A DateFormatter
在不从字符串解析时间时默认使用午夜时间。当字符串中的日期不存在午夜时,这会使它失败。
解决方案是不要将午夜用作一天中的默认时间。中午是一个更安全的默认时间。因此,一种解决方案是在输入中包含一天中的时间并以以下格式解析它:
let dateString = "1994-04-01 12:00:00"
let dateFormatter = DateFormatter()
dateFormatter.timeZone = TimeZone(identifier: timeZoneId)
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
另一种解决方案是为日期格式化程序提供一个默认日期,即某一天的中午:
// Reference date was 00:00:00 UTC on 1 January 2001. This is noon of the same day in UTC.
dateFormatter.defaultDate = Date(timeIntervalSinceReferenceDate: 12*60*60)
如果您要在 iOS 或 macOS 上进行任何日期解析或操作,非常 观看 WWDC 2013 Session 227: Solutions to Common Date and Time Challenges 是个好主意。