【问题标题】:Dateformatter issue in swiftswift中的日期格式化程序问题
【发布时间】:2016-12-22 07:33:03
【问题描述】:

我的 API 以 UTC 格式向我发送日期字符串,例如 2016 年 2 月 20 日上午 11:45。 为了在我的时区显示日期,我将日期从 UTC 转换为本地时区,如下面的代码

    let sourceDateString = "12/20/2016 11:45 AM"
    let formatter = DateFormatter()
     formatter.dateFormat = "MM/dd/yyyy hh:mm a"
     formatter.timeZone = TimeZone(identifier: "UTC")
     let date = formatter.date(from: sourceDateString)

     print(date)

     formatter.timeZone = NSTimeZone.local
     formatter.dateFormat = "MMM dd,yyyy hh:mm a"

     let strDate = formatter.string(from: date!)
     print(strDate)

如果我的设备时间格式为 12 小时,则上述代码工作正常,但如果我使用设备上的 24 小时日期,则上述代码不起作用。事件无法将 UTC 字符串转换为日期。

请检查设备中的上述代码,它在模拟器中运行良好。

【问题讨论】:

  • 使用HH 代替hhhh 用于12 小时格式,HH 用于24 小时格式。
  • 将日期格式化程序区域设置为“Posix”,比较stackoverflow.com/questions/40692378/…
  • @MartinR 在将 dateFormatter 语言环境分配给“POSIX”后,格式需要包含“HH”而不是“hh”(如您的回答中所述),对吗?
  • @AhmadF: 不,您也可以在修复语言环境之后将其设置为“hh a”。设置“Posix 语言环境”是为了忽略用户的语言环境设置。
  • @MartinR 好的,我知道需要更改语言环境,但是“HH”是 24 小时格式,如果“hh”保持原样,它应该如何工作?很抱歉打扰,但我真的很想了解这里发生了什么:)

标签: ios swift date datetime nsdateformatter


【解决方案1】:

在@Martin R 的帮助下,以下代码对我有用。

    let sourceDateString = "12/20/2016 11:45 AM"
    let formatter = DateFormatter()
    formatter.dateFormat = "MM/dd/yyyy hh:mm a"
    formatter.timeZone = TimeZone(identifier: "UTC")
    formatter.locale = Locale(identifier: "en_US_POSIX")
    let date = formatter.date(from: sourceDateString)

    print(date)

    formatter.timeZone = NSTimeZone.local
    formatter.dateFormat = "MMM dd,yyyy hh:mm a"

    let strDate = formatter.string(from: date!)
    print(strDate)

我忘记添加“POSIX”。

【讨论】:

    【解决方案2】:

    用 Swift 3.0 编写的代码

    您需要在日期格式化程序上提供本地标识符。

    这是以下工作和测试的代码。

    let sourceDateString = "12/22/2016 09:19 AM"
        let formatter = DateFormatter()
        formatter.dateFormat = "MM/dd/yyyy hh:mm a"
        formatter.locale = Locale(identifier: "en-US")
        formatter.timeZone = TimeZone(identifier: "UTC")
        let date = formatter.date(from: sourceDateString)
    
        print("\(date)")
    
        formatter.timeZone = NSTimeZone.local
        formatter.dateFormat = "MMM dd,yyyy hh:mm a"
    
        let strDate = formatter.string(from: date!)
        print(strDate)
    

    如果有效,请告诉我。

    【讨论】:

    • 我需要像 2016 年 12 月 28 日上午 12:30 这样的输出,所以您的代码将无法正常工作。
    • 好的,我已经编辑了答案,只是缺少时区标识符...
    【解决方案3】:

    快速解决此问题的方法是将 12 小时制转换为 24 小时制。

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateformatter.dateFormat = @"hh:mm a";
    NSDate *date = [dateformatter dateFromString:departTime];
    dateformatter.dateFormat = @"HH:mm";
    NSString *time24 = [dateformatter stringFromDate:date];
    departTimelbl.text=time24;
    

    这里可以替换 formatter.dateFormat = "MM/dd/yyyy hh:mm a"formatter.dateFormat = "MM/dd/yyyy HH:mm

    【讨论】:

    • 这不是将 12 小时转换为 24 小时。
    • 需要把这段代码formatter.dateFormat = "MM/dd/yyyy hh:mm a"改成formatter.dateFormat = "MM/dd/yyyy HH:mm
    • 没有人通过添加以下行它有效。 formatter.locale = 语言环境(标识符:“en_US_POSIX”)
    猜你喜欢
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    相关资源
    最近更新 更多