【问题标题】:Swift converting NSDate to 24h Format fails on Device在设备上将 NSDate 快速转换为 24h 格式失败
【发布时间】:2015-10-31 11:36:23
【问题描述】:

当我在 iPhone6 上运行我的应用程序时,我遇到了一个恼人的错误。
我需要将一个小时(由 datePicker 选择)从 12h 格式转换为 24h 格式。
简单的事!是的,我很确定,但是...我的代码在模拟器上运行,但在设备上运行。
代码如下:

func convertTimeTo24HoursFomratString() -> String {
        let dateFormatter = NSDateFormatter()
        // isFormatTime24Hours is a static function that returns me if the device has a 24h clock or not. It works fine both on device and on simulator
        //if NSDateUtility.isFormatTime24Hours() {
        //    dateFormatter.dateFormat = "h:mm a"
        //    return dateFormatter.stringFromDate(self)
        //}

        dateFormatter.dateFormat = "HH:mm"
        return dateFormatter.stringFromDate(self)
}

我哪里做错了?
iOS 版本到处都是 9.1。
提前感谢您的任何回答!

[Paul.s question 后编辑]
在模拟器上,它返回 24 小时格式的日期(右)。
在设备上,它返回 12 小时格式的日期(错误)。

【问题讨论】:

  • 您在设备上与 sim 上获得的结果有何不同?
  • 设备的区域设置是否与模拟器不同?例如,您可能住在意大利,而模拟器设置为美国。不同的语言环境可以从 NSDateFormatter 给出不同的结果。如果您认为这可能是问题所在,请尝试将 NSDateFormatter 的 locale 属性更改为静态属性。
  • @icant 所以,我的NSDateUtility.isFormatTime24Hours 返回我false,在设备和模拟器上都运行。所以我认为问题不在这里。不是吗?
  • 如果您只想要 24 小时,为什么您的代码会分支并提供两种不同的格式?你怎么知道你的isFormatTime24Hours 是正确的?
  • @Paul.s 调试和检查isFormatTime24Hours' 值。我知道我的设备时钟格式是 12 小时,所以我知道它是否正确。我刚刚意识到我已经粘贴了“如果”,这是我绝望的测试:) 我将在主帖中发表评论

标签: ios swift nsdate nsdateformatter


【解决方案1】:

QA1480:将自己设置为en_US_POSIX 的格式化程序语言环境。否则您设备的区域设置会影响日期模式。

【讨论】:

  • 明白了!我刚刚在我的 dateFormatter 中添加了语言环境,它可以工作了!
【解决方案2】:

Apple 的开发者库中有一个可能与您的案例相关的示例。

时间的表示可能是 13:00。但是,在 iOS 中,如果用户将 24 小时制设置为关闭,则时间可能是下午 1:00。

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html#//apple_ref/doc/uid/TP40002369-SW1

我建议避免提供自定义格式。如果可能,尝试使用dateStyletimeStyle。这将确保所有用户的适应性。

【讨论】:

    【解决方案3】:

    试试这个

    lazy var dateFormatter: NSDateFormatter = {
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "dd-MM-yyyy HH mm"
        return dateFormatter
    }()
    

    你可以这样调用函数

    let dateYour = YourTextField.text
    date = dateFormatter.dateFromString(dateYour!)!
    

    var date : NSDate
    let dateYour2 = dateFormatter.stringFromDate(date)
    

    反正IOS9 U可以通过nil来使用国际格式

    var time = time.descriptionWithLocale(nil)
    print(time) // 2015-10-30 14:12:18 +0100
    

    【讨论】:

      【解决方案4】:
      let date = NSDate()                     // 31 Oct 2015 14:04
      let formater = NSDateFormatter.init()
      formater.setLocalizedDateFormatFromTemplate("HH:mm")
      formater.stringFromDate(date)           // 14:04
      formater.setLocalizedDateFormatFromTemplate("hh:mm")
      formater.stringFromDate(date)           // 2:12 PM
      formater.dateFormat = "HH:mm"
      formater.stringFromDate(date)           // 14:04
      formater.dateFormat = "hh:mm"
      formater.stringFromDate(date)           // 02:04
      

      检查模拟器,检查设备...所以,很难说...

      【讨论】:

      • 当然可以,但是根据您的设备配置,这种行为可能会发生变化。
      • 它是一样的,即使我改变了我的语言环境,最后两个输出是相同的(如预期的那样)/iOS 7,iOS 8 iPhone,iPad 和模拟器,模拟器 iOS9,OSX 10.11.1,操场...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      • 2011-02-14
      • 1970-01-01
      • 2012-03-31
      • 2011-09-18
      • 2016-09-15
      • 1970-01-01
      相关资源
      最近更新 更多