【问题标题】:Date to String [format string] String to Date in Swift日期到字符串 [格式字符串] Swift 中的字符串到日期
【发布时间】:2020-04-10 04:11:16
【问题描述】:

我整天都在为这个问题绞尽脑汁,似乎无法找到解决方案。我有一个查询健康数据存储的健身程序。在 predicateForSamples(withStart: myStartDate, end: myEndDate) 我发现从 datePicker 获取日期会及时发送一个时刻,因此我的查询不会像我想要的那样返回一整天的结果。所以,我想如果我采用 datePicker 日期并将其转换为开始和结束格式,我的问题就会得到解决。但是,使用 let date = dateFormatter.date(from: dateString) 返回正确的日期,但两个函数的时间都返回为 04:00:00 +0000。

如果有人有任何建议,请随时伸出援助之手。非常感谢!

func convertStartDate(StartDate: Date) -> Date {

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyy-MM-dd '00':'00':'01' +0000"
    let dateString = dateFormatter.string(from: StartDate)
    print("convertingStartDate() - \(dateString)")
    let date = dateFormatter.date(from: dateString)
    print(date as Any)

    return date!
}

func convertEndDate(EndDate: Date) -> Date {

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyy-MM-dd '23':'59':'59' +0000"
    let dateString = dateFormatter.string(from: EndDate)
    print("convertingEndDate() - \(dateString)")
    let date = dateFormatter.date(from: dateString)

    return date!
}

【问题讨论】:

  • 这里是输出:2020-04-09 04:00:00 +0000
  • 为什么你的日期格式中有数字??
  • 我想要一个特定的时间来捕获 Health Kit 中的所有数据。所以,我把它改成了午夜之后和之前。
  • 如果您的时区是 -04:00,则日期正确。 print 始终以 UTC (+0000) 显示日期。时间格式'00':'00':'01' 是语法糖。
  • 你应该保持你的日期不变,如果你想知道一个日期是否和另一个日期在同一天,你可以使用日历方法 isDate inSameDayAs developer.apple.com/documentation/foundation/calendar/…stackoverflow.com/a/43664156/2303865

标签: ios swift date date-formatting


【解决方案1】:

这应该可以解决您的问题

func convertStartDate(StartDate: Date) -> Date {

    let dateFormatter = DateFormatter()
    dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
    dateFormatter.dateFormat = "yyy-MM-dd '00':'00':'01' +0000"
    let dateString = dateFormatter.string(from: StartDate)
    dateFormatter.dateFormat = "yyy-MM-dd HH:mm:ss +0000"
    let date = dateFormatter.date(from: dateString)
    print(date as Any)

    return date!
}

func convertEndDate(EndDate: Date) -> Date {

    let dateFormatter = DateFormatter()
    dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
    dateFormatter.dateFormat = "yyy-MM-dd '23':'59':'59' +0000"
    let dateString = dateFormatter.string(from: EndDate)
    dateFormatter.dateFormat = "yyy-MM-dd HH:mm:ss +0000"
    let date = dateFormatter.date(from: dateString)

    return date!
}

【讨论】:

  • 当预期为 2020-04-09 00:00:01 +0000 时,convertStartDate 的输出返回为 2020-04-09 04:00:01 +0000。 convertEndDate 也有同样的问题。对正在发生的事情有任何想法吗?谢谢!
  • 这是一个时区问题尝试设置 dateFormatter.locale = Locale(identifier: "en_US_POSIX")
  • 对不起。它仍然返回错误的时区。我非常感谢您提供的帮助。
  • 在使用固定日期格式时,在设置 dateFormat 之前,您应该始终将您的语言环境设置为 en_US_POSIX,否则您的 dateFormat 将反映用户设备的语言环境和设置
  • 是的,我将语言环境与时区代码行混合在一起,添加语言环境和时区是一个很好的做法,我建议您也看看williamboles.me/…
【解决方案2】:

除了上述之外,这实际上是通过设置dateFormatter.timeZone = TimeZone(secondsFromGMT: 0) 来解决的,因为您的问题是距离 GMT 的秒数。

【讨论】:

  • 做到了!非常感谢您参与对话。
  • 谢谢@Skyler Tanner
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2018-07-31
  • 1970-01-01
  • 2022-01-13
  • 2014-05-20
相关资源
最近更新 更多