【问题标题】:Xcode Swift am/pm time to 24 hour formatXcode Swift 上午/下午时间到 24 小时格式
【发布时间】:2015-06-02 00:52:18
【问题描述】:

我正在尝试将 am/pm 格式时间转换为 24 小时格式时间

6:35 PM to 18:35

我在操场上尝试了这段代码,但似乎没有 如果我把时间单独工作,就工作

let dateAsString = "02/12/15, 6:35 PM"
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "HH"
let date = dateFormatter.dateFromString(dateAsString) //returns nil

有谁知道如何做到这一点?

【问题讨论】:

  • import UIKit let date = Date() print(" Date:",date) let dateFormatter = DateFormatter() dateFormatter.dateFormat = "h:mm a" let Date12Hr = dateFormatter.string(from: date) print("12 hour formatted Date:",Date12) 这在操场或模拟器中工作正常..在设备中运行时它没有转换???

标签: swift time nsdateformatter


【解决方案1】:

只需使用 NSDateFormatter 和“h:mm a”格式将其转换为日期,然后使用“HH:mm”格式将其转换回字符串。查看此date formatting guide 以熟悉此材料。

let dateAsString = "6:35 PM"
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "h:mm a"
dateFormatter.locale = Locale(identifier: "en_US_POSIX") // fixes nil if device time in 24 hour format
let date = dateFormatter.dateFromString(dateAsString)

dateFormatter.dateFormat = "HH:mm"
let date24 = dateFormatter.stringFromDate(date!)

【讨论】:

  • 如果设备时间采用 24 小时格式,此代码将给出 nil。有什么建议吗?
  • 试试这个在 dateFormatter 声明之后添加以下行。 dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") 作为区域设置!这解决了我的问题。
  • @Tejinder @Nipul Daki 我给了语言环境标识符,问题就解决了! formatter.locale = 语言环境(标识符:“en_US_POSIX”)
  • 但是为什么当设备是 24 小时格式时它甚至返回 nil 呢?为什么在指定 dateFormat 本身时它甚至会影响日期(nil)? @BurcuKutluay
  • 感谢您提及您使用显式语言环境的原因
【解决方案2】:

斯威夫特 3

时间格式 24 小时到 12 小时

let dateAsString = "13:15"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm"

let date = dateFormatter.date(from: dateAsString)
dateFormatter.dateFormat = "h:mm a"
let Date12 = dateFormatter.string(from: date!)
print("12 hour formatted Date:",Date12)

输出将是 12 小时格式日期:下午 1:15

时间格式 12 小时到 24 小时

let dateAsString = "1:15 PM"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "h:mm a"

let date = dateFormatter.date(from: dateAsString)
dateFormatter.dateFormat = "HH:mm"

let Date24 = dateFormatter.string(from: date!)
print("24 hour formatted Date:",Date24)

输出将是 24 小时格式日期:13:15

【讨论】:

  • 当从 24 小时制更改为 12 小时制时,我需要添加 dateFormatter.locale = Locale(identifier: "en_US_POSIX") 以强制它忽略设备区域设置。
  • 只是日期的转换!
  • 您可以尝试将设备设置为 24 小时制。上面的代码在我的情况下不起作用。
  • 这是我发现的将上午/下午时间转换为 24 小时时间的所有废话中唯一对我有用的方法。谢谢
【解决方案3】:

斯威夫特 3 *

12小时(即上午和下午)转换为24小时格式的代码,其中包括-

时:分:秒:AM/PM 到时:分:秒

func timeConversion24(time12: String) -> String {
    let dateAsString = time12
    let df = DateFormatter()
    df.dateFormat = "hh:mm:ssa"

    let date = df.date(from: dateAsString)
    df.dateFormat = "HH:mm:ss"

    let time24 = df.string(from: date!)
    print(time24)
    return time24
}

输入

07:05:45 下午

输出

19:05:45

类似

24 小时转换为12 小时(即上午和下午) 格式的代码,其中包括-

时:分:秒到时:分:秒:AM/PM

func timeConversion12(time24: String) -> String {
    let dateAsString = time24
    let df = DateFormatter()
    df.dateFormat = "HH:mm:ss"

    let date = df.date(from: dateAsString)
    df.dateFormat = "hh:mm:ssa"

    let time12 = df.string(from: date!)
    print(time12)
    return time12
}

输入

19:05:45

输出

07:05:45 下午

【讨论】:

    【解决方案4】:

    下面是swift 3版本的解决方案-

    let dateAsString = "6:35:58 PM"
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "h:mm:ss a"
    let date = dateFormatter.date(from: dateAsString)
    
    dateFormatter.dateFormat = "HH:mm:ss"
    let date24 = dateFormatter.string(from: date!)
    print(date24)
    

    【讨论】:

      【解决方案5】:

      Swift 3.0.2 版,Xcode 8.2.1 版 (8C1002)(12 小时格式):

      func getTodayString() -> String{
      
              let formatter = DateFormatter()
              formatter.dateFormat = "h:mm:ss a "
              formatter.amSymbol = "AM"
              formatter.pmSymbol = "PM"
      
              let currentDateStr = formatter.string(from: Date())
              print(currentDateStr)
              return currentDateStr 
      }
      

      输出: 12:41:42 AM

      欢迎评论。谢谢

      【讨论】:

      • 这个问题是关于从 12 小时时间到 24 小时时间,这个答案涉及到另一个方向。
      • 答案不正确!!你很困惑,因为你正在用 12:41:42 进行测试。尝试下午 1 点或更长。
      • 嗨,如果用户输入上午 6:11,我如何以这种格式转换为 2019-03-09 13:38:32 +0000
      • 所以你必须使用当前日期和时间(用户提供的输入)
      • 这在操场和模拟器中运行良好..在设备中运行时未转换
      【解决方案6】:

      这是更多格式的答案。

      ** Xcode 12、Swift 5.3 **

      let dateFormatter = DateFormatter()
      dateFormatter.dateFormat = "HH:mm:ss"
      var dateFromStr = dateFormatter.date(from: "12:16:45")!
      
      dateFormatter.dateFormat = "hh:mm:ss a 'on' MMMM dd, yyyy"
      //Output: 12:16:45 PM on January 01, 2000
      
      dateFormatter.dateFormat = "E, d MMM yyyy HH:mm:ss Z"
      //Output: Sat, 1 Jan 2000 12:16:45 +0600
      
      dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
      //Output: 2000-01-01T12:16:45+0600
      
      dateFormatter.dateFormat = "EEEE, MMM d, yyyy"
      //Output: Saturday, Jan 1, 2000
      
      dateFormatter.dateFormat = "MM-dd-yyyy HH:mm"
      //Output: 01-01-2000 12:16
      
      dateFormatter.dateFormat = "MMM d, h:mm a"
      //Output: Jan 1, 12:16 PM
      
      dateFormatter.dateFormat = "HH:mm:ss.SSS"
      //Output: 12:16:45.000
      
      dateFormatter.dateFormat = "MMM d, yyyy"
      //Output: Jan 1, 2000
      
      dateFormatter.dateFormat = "MM/dd/yyyy"
      //Output: 01/01/2000
      
      dateFormatter.dateFormat = "hh:mm:ss a"
      //Output: 12:16:45 PM
      
      dateFormatter.dateFormat = "MMMM yyyy"
      //Output: January 2000
      
      dateFormatter.dateFormat = "dd.MM.yy"
      //Output: 01.01.00
      
      //Output: Customisable AP/PM symbols
      dateFormatter.amSymbol = "am"
      dateFormatter.pmSymbol = "Pm"
      dateFormatter.dateFormat = "a"
      //Output: Pm
      
      // Usage
      var timeFromDate = dateFormatter.string(from: dateFromStr)
      print(timeFromDate)
      

      【讨论】:

        【解决方案7】:

        使用此功能进行日期转换,当您的设备采用 24/12 小时格式时,它可以正常工作

        https://developer.apple.com/library/archive/qa/qa1480/_index.html

        func convertDateFormatter(fromFormat:String,toFormat:String,_ dateString: String) -> String{
            let formatter = DateFormatter()
            formatter.locale = Locale(identifier: "en_US_POSIX")
            formatter.dateFormat = fromFormat
            let date = formatter.date(from: dateString)
            formatter.dateFormat = toFormat
            return  date != nil ? formatter.string(from: date!) : ""
        }
        

        【讨论】:

          【解决方案8】:

          不幸的是,苹果优先考虑设备日期格式,因此在某些情况下,与您输入的内容相反,请迅速将您的格式更改为 12 小时

          要解决这个问题,需要使用 setLocalizedDateFormatFromTemplate 而不是 dateFormat 来隐藏 AM 和 PM

          let formatter = DateFormatter()
          formatter.setLocalizedDateFormatFromTemplate("HH:mm:ss a")
          formatter.amSymbol = ""
          formatter.pmSymbol = ""
          formatter.timeZone = TimeZone(secondsFromGMT: 0)
          var prettyDate = formatter.string(from: Date())
          

          您可以查看一个非常有用的帖子,其中包含详细信息 https://prograils.com/posts/the-curious-case-of-the-24-hour-time-format-in-swift

          【讨论】:

            【解决方案9】:

            这是其他方式的代码

            对于 Swift 3

             func amAppend(str:String) -> String{
                var temp = str
                var strArr = str.characters.split{$0 == ":"}.map(String.init)
                var hour = Int(strArr[0])!
                var min = Int(strArr[1])!
                if(hour > 12){
                    temp = temp + "PM"
                }
                else{
                    temp = temp + "AM"
                }
                return temp
            }
            

            【讨论】:

            • 不应该是(小时 >= 12) - 因为中午 12 点是下午 12 点。午夜 00:00 是凌晨 12 点
            【解决方案10】:
            let calendar = Calendar.current
            let hours    = calendar.component(.hour, from: Date())
            let minutes  = calendar.component(.minute, from: Date())
            let seconds  = calendar.component(.second, from: Date())
            

            【讨论】:

            • 这不是军事时间。
            【解决方案11】:

            在我的例子中,我在这里使用了一个函数,通过它我用正常时间格式更新标签,然后我存储所选时间的 24 小时格式以执行其他任务..

            这是我的代码...

            func timeUpdate(sender: NSDate)
            {
                let timeSave = NSDateFormatter() //Creating first object to update time label as 12hr format with AM/PM
                timeSave.timeStyle = NSDateFormatterStyle.ShortStyle //Setting the style for the time selection.
                self.TimeShowOutlet.text = timeSave.stringFromDate(sender) // Getting the string from the selected time and updating the label as 1:40 PM
                let timeCheck = NSDateFormatter() //Creating another object to store time in 24hr format.
                timeCheck.dateFormat = "HH:mm:ss" //Setting the format for the time save.
                let time = timeCheck.stringFromDate(sender) //Getting the time string as 13:40:00
                self.timeSelectedForCheckAvailability = time //At last saving the 24hr format time for further task.
            }
            

            编写此函数后,您可以在从日期/时间选择器中选择时间的地方调用它。

            谢谢, 希望这会有所帮助。

            【讨论】:

              【解决方案12】:

              这与我们朋友的回答类似:https://stackoverflow.com/a/43801717/2796837,但利用我们所有互联网朋友的想法,我想出了以下更完整的单一解决方案:

              let amPmFormat = "h:mm a"
              let twentyFourHFormat = "HH:mm"
              func hourMinuteParser(date: Date) -> KotlinInt{
                  let formatter = DateFormatter()
                  if DateFormatter.dateFormat(fromTemplate: "j",options:0, locale: Locale.current)!.contains("a") {
                      formatter.dateFormat = amPmFormat
                  }else{
                      formatter.dateFormat = twentyFourHFormat
                  }
                  let stringTime = formatter.string(from: date)
                  let time = formatter.date(from: stringTime)
                  formatter.dateFormat = twentyFourHFormat
              
                  let time24 = formatter.string(from: time!)
                  let timeWithoutSpecialCharacters = time24.replacingOccurrences(of: ":", with: "")
                  let int2 = Int32(timeWithoutSpecialCharacters) ?? 0
                  return KotlinInt(int: int2)
              }
              

              这将解析您的时间,甚至与它的格式无关并将其输出为 HH:mm,您可以将第三种格式更改更改为您想要的任何格式。

              【讨论】:

                猜你喜欢
                • 2012-01-10
                • 2012-02-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-04-12
                • 2021-12-08
                • 2021-09-17
                相关资源
                最近更新 更多