Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 我想将日期格式化为字符串,但它给了我零,我想在UITextField.text中使用日期_Swift - Fatal编程技术网

Swift 我想将日期格式化为字符串,但它给了我零,我想在UITextField.text中使用日期

Swift 我想将日期格式化为字符串,但它给了我零,我想在UITextField.text中使用日期,swift,Swift,//creationdate来自一个api调用 var creationDate = "2020-11-04T16:46:59.439212Z" let formatter = DateFormatter() formatter.dateStyle = .long formatter.timeStyle = .none formatter.dateFormat = "dd-MM-yyyy" var cre

//creationdate来自一个api调用

    var creationDate = "2020-11-04T16:46:59.439212Z" 

    let formatter = DateFormatter()
    formatter.dateStyle = .long
    formatter.timeStyle = .none
    formatter.dateFormat = "dd-MM-yyyy"
    var creationDateFormattedInToDate = formatter.date(from: 
                                        creationDate)

    print("date \(creationDateFormattedInToDate)")

因此,我希望该日期的格式为04-11-2020,并传入一个UITextField.text

您将需要两个格式化程序,一个用于将输入日期解析为日期对象,另一个用于将日期对象转换为正确格式的字符串

输入日期似乎是internet日期/时间的变体,因此我们使用ISO8601数据格式化程序

let formatter = ISO8601DateFormatter()
formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
第二个格式化程序是具有自定义格式的基本日期格式化程序

let outputFormatter = DateFormatter()
outputFormatter.dateFormat = "dd-MM-yyyy"
然后我们可以像这样使用它们

if let date = formatter.date(from: creationDate) {
    someTextField.text = outputFormatter.string(from: date)
}

您需要使用一个格式化程序来解析来自服务器的响应(这是所谓的and“ISO 8601”或“RFC 3339”格式),另一个格式化程序用于准备UI中日期的字符串表示形式

关于解析服务器响应的日期格式化程序:

  • 将格式化程序的
    locale
    设置为
    locale(标识符:“en_US_POSIX”)
  • 如果要设置
    dateFormat
    ,则解析此日期字符串时的样式设置是不相关的
  • 从字符串解析日期时,将
    dateFormat
    设置为
    yyyy-MM-dd'HH:MM:ss.ssssss x
  • 如果计划使用此格式化程序进行反向日期到字符串转换(用于准备要发送到服务器的日期字符串),则可能需要将格式化程序的
    时区设置为
    时区(secondsFromGMT:0)
关于用于在UI中准备日期字符串表示形式的日期格式化程序:

  • 我不建议在用户界面中使用固定的
    dd-MM-yyyy
    格式。这对欧洲用户来说可能是自然的,但对大多数美国用户来说可能是不自然的,他们通常希望在一天的前一个月看到

  • 我建议不要为第二个日期格式化程序使用
    dateFormat
    ,而是使用
    dateStyle
    (例如
    .medium
    .long
    )。它产生了一个漂亮的、本地化的、自然的读取日期字符串

  • 如果您坚持在您的UI中使用
    dd
    MM
    yyyy
    ,我会使用
    setLocalizedDateFormatFromTemplate
    对其进行本地化,以使日期和月份按照该特定用户期望的逻辑顺序显示(对于美国用户,月后接日,对于大多数其他地区,月后接日)

因此:


格式
“dd-MM-yyyy”
与字符串
“2020-11-04T16:46:59.43921z”
不匹配。甚至还没有结束。谢谢,不知什么原因,我被Xcode中的自动完成愚弄了,以为我不能只写。使用分数秒,但重新启动后再试一次,效果很好(我使用的是测试版:)。很高兴知道丢失的精度,但我想在这种情况下它并没有那么重要。@JoakimDanielson您可能也会丢失DateFormatter的精度,但它会增加000来填补空白。您只需要一个
S
,它将解析尽可能多的小数秒(限制为3秒)。唯一的区别是在创建日期字符串时。如果您添加3个以上的SSS,它将用零填充。我想知道为什么他们没有添加一个选项来指定ISO8601DateFormatter的小数秒精度。它可能在引擎盖下使用DateFormatter,否则他们不会将其固定为3位。如果我可能使用格式化程序进行反向转换,我希望指定所需的毫秒数,以防服务器对格式有特殊要求。(这就是为什么我没有使用
ISO8601DateFormatter
)这可能不是问题,但似乎是最佳实践,IMHO。但每个人都有自己的。
let serverDateFormatter = DateFormatter()
serverDateFormatter.locale = Locale(identifier: "en_US_POSIX")
serverDateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
serverDateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSX"

let uiFormatter = DateFormatter()
uiFormatter.dateStyle = .medium  // or uiFormatter.setLocalizedDateFormatFromTemplate("ddMMyyyy")

if let date = serverDateFormatter.date(from: creationDateString) {
    let string = uiFormatter.string(from: date)
    // use that `string` in your UI
}