Xcode Swift将am/pm时间转换为24小时格式

94

我正在尝试将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

有人知道如何完成这个吗?


导入 UIKitlet date = Date() print(" 日期:",date) let dateFormatter = DateFormatter() dateFormatter.dateFormat = "h:mm a" let Date12Hr = dateFormatter.string(from: date) print("12 小时格式化的日期:",Date12)这在 Playground 或模拟器中运行良好,但在设备上运行时无法转换? - SANTOSH
12个回答

186

使用NSDateFormatter将其转换为日期,格式为"h:mm a",再使用"HH:mm"格式将其转换回字符串。请参阅此日期格式化指南以熟悉此材料。

enter image description here

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!)

21
如果设备时间以24小时制呈现,这段代码会返回nil。有什么建议吗? - Tejinder
23
请在dateFormatter声明之后添加以下代码: dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") as Locale! 这样可以解决我的问题。 - Nipul Daki
2
@Tejinder @Nipul Daki 我提供了本地标识符,问题已经解决! formatter.locale = Locale(identifier: "en_US_POSIX") - Burcu Kutluay
1
为什么当设备处于24小时制时,它会返回nil呢?为什么指定了dateFormat后它会影响日期(nil)呢?@BurcuKutluay - SwiftiSwift
感谢您提到使用显式语言环境的原因。 - Mojtaba Hosseini
1
@BurcuKutluay 谢谢。dateFormatter.locale = Locale(identifier: "en_US_POSIX")这行代码节省了我的时间。 - Badal Shah

68

Swift 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 PM

将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


13
当从24小时制转换为12小时制时,我需要添加dateFormatter.locale = Locale(identifier: "en_US_POSIX")来强制忽略设备语言环境。 - Sunly
这只是一个日期转换! - Azharhussain Shaikh
3
你可以尝试将设备设置为24小时制。上面的代码在我的情况下不起作用。 - Sunly
1
这是我在所有找到的垃圾中唯一有效的将AM/PM时间转换为24小时制的方法。谢谢。 - C. Hellmann

18

Swift 3 *

代码用于将12小时制(即上午和下午)转换为24小时制,包括:

小时:分钟:秒:上午/下午 转换为 小时:分钟:秒

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:45PM

输出

19:05:45

同样地

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

小时:分钟:秒转为小时:分钟:秒:上午/下午

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:45PM


7

以下是更加易懂的答案,关于IT技术方面的翻译。

** 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)

5
以下是解决方案的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)

4

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

欢迎留言。谢谢。


这个问题是关于从12小时制转换为24小时制,而这个答案则涉及到相反的方向。 - Abizern
1
不正确的答案!!你感到困惑是因为你正在测试12:41:42。请尝试1pm或更晚的时间。 - TheTiger
嗨,如果用户输入6:11AM,我该如何将其转换为2019-03-09 13:38:32 +0000格式? - Gorib Developer
所以您需要使用当前日期和时间(由用户提供的输入)。 - Shobhakar Tiwari
这在 Playground 和模拟器中运行良好,但在设备上运行时未转换。 - SANTOSH

3

使用此函数进行日期转换,当设备处于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!) : ""
}

2
不幸的是,苹果优先使用设备日期格式,因此在某些情况下,与您所输入的相反,Swift会将您的格式更改为12小时制。
要解决这个问题,需要使用setLocalizedDateFormatFromTemplate而不是dateFormat,并隐藏上午和下午。
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

1
这里是编写反向代码的代码。
对于 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
}

应该是 (hour >= 12) 吧 - 因为中午12点是下午12点,而午夜00:00是上午12点。 - iKK

1
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())

这不是军事时间。 - WikipediaBrown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接