Swift 日期字符串转换不使用';t返回十进制毫秒

Swift 日期字符串转换不使用';t返回十进制毫秒,swift,datetime,nsdateformatter,Swift,Datetime,Nsdateformatter,我需要检查日期字符串的格式是否与2017-01-01 00:00:00.000的格式完全相同,带3个十进制毫秒,否则返回 我使用的是yyyy-MM-dd hh:MM:ss.SSS,但它不返回任何十进制毫秒。为什么呢?当我使用DateFormatter将Date()转换为字符串时,它将返回正确的ss.SSS let str = "2017-01-01 00:00:00.000" let df = DateFormatter() df.dateFormat = "yyyy-MM-dd HH:mm:s

我需要检查日期字符串的格式是否与2017-01-01 00:00:00.000的格式完全相同,带3个十进制毫秒,否则返回

我使用的是
yyyy-MM-dd hh:MM:ss.SSS
,但它不返回任何十进制毫秒。为什么呢?当我使用
DateFormatter
Date()
转换为字符串时,它将返回正确的
ss.SSS

let str = "2017-01-01 00:00:00.000"
let df = DateFormatter()
df.dateFormat = "yyyy-MM-dd HH:mm:ss.SSS"
df.timeZone = NSTimeZone(abbreviation: "GMT") as TimeZone!
if let date = df.date(from: str) {
    print("date: \(date)")
} else {
    print("no")
}

output: date: 2017-01-01 00:00:00 +0000
此外,如果我添加ss.S/ss.ss all并返回true,则不会出现错误。为什么?

说明
1…n
毫秒的数字是有效的。你可以写任意多的大写字母
S
,这没什么区别。您必须单独检查第二个条件:

extension String {
    var endsWithThreeDecimalDigits: Bool {
        return self.range(of: "\\.\\d{3}$", options: .regularExpression) != nil
    }
}

let df = DateFormatter()
df.dateFormat = "yyyy-MM-dd HH:mm:ss.SSS"
df.timeZone = TimeZone(abbreviation: "GMT")

if let date = df.date(from: str), str.endsWithThreeDecimalDigits {
    print("date: \(date)")
} else {
    print("no")
}

Date
值的默认描述不打印毫秒,但它在那里。您的问题是什么?我需要检查日期字符串的格式是否与2017-01-01 00:00:00.000的格式完全相同,带有3个十进制毫秒,否则返回false谢谢,为什么输出日期中缺少毫秒?输出:日期:2017-01-01 00:00:00+0000I看不出此
endsWithThreeDecimalDigits
check的意义。如果
If let date=df.date(from:str)
部分代码成功,那么您已经知道字符串以三位数字结尾,因为如果没有,字符串与日期格式不匹配,
df.date(from:str)
将返回
nil
@JimH。正如我前面解释的,毫秒是存在的。苹果选择在你调用
print
时不显示它,因为很少有应用程序需要这样的精度。正如您所发现的,当您调用
df.string(from:date)
@rmaddy
2017-01-01 00:00:00.12345
根据格式化程序,它是一个有效的日期,但不符合OP的“毫秒精确3位小数”的要求@code。我没想到会这样,但确实如此。所以这个答案应该是OP想要的。