如何在 Swift 中以简短的格式获取当前日期

45

以下图片中您可以看到我编写的代码以及所有变量的值:

class fun getCurrentShortDate() -> String {
    var todaysDate = NSDate()
    var dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "dd-MM-yyyy"
    var DateInFormat = dateFormatter.stringFromDate(todaysDate)

    return DateInFormat
}

变量值

您可以看到当前日期很容易找到,但是当我尝试将NSDate更改为字符串时,它就无法实现。


3
  1. 不要感到羞愧,每个人都有起点。
  2. 直接将代码粘贴到您的帖子中,而不是发布图片。
- Aggressor
2
你能执行 println(DateInFormat) 并证明字符串为空吗? - Aggressor
1
有些奇怪。那段代码应该很难出问题。可能是调试器的问题——Xcode调试器的变量显示功能非常不稳定,不能完全信任。 - Hot Licks
2
@Aggressor - 应该是 println(DateInFormat) - Hot Licks
抱歉,已经修正了,谢谢。(读错名字了) - Aggressor
8个回答

64

Xcode 11或更高版本 • Swift 5.1或更高版本


extension TimeZone {
    static let gmt = TimeZone(secondsFromGMT: 0)!
}

extension Locale {
    static let ptBR = Locale(identifier: "pt_BR")
}

extension Formatter {
    static let date = DateFormatter()
}

extension Date {
    func localizedDescription(date dateStyle: DateFormatter.Style = .medium,
                              time timeStyle: DateFormatter.Style = .medium,
                              in timeZone: TimeZone = .current,
                              locale: Locale = .current,
                              using calendar: Calendar = .current) -> String {
        Formatter.date.calendar = calendar
        Formatter.date.locale = locale
        Formatter.date.timeZone = timeZone
        Formatter.date.dateStyle = dateStyle
        Formatter.date.timeStyle = timeStyle
        return Formatter.date.string(from: self)
    }
    var localizedDescription: String { localizedDescription() }
}

Date().localizedDescription  // "18 Dec 2021 06:43:50"
Date().localizedDescription(in: .gmt)  // "18 Dec 2021 06:43:50" UTC time
Date().localizedDescription(date: .short, time: .short)  // "18/12/21 03:43"
Date().localizedDescription(date: .full, time: .full)  // "Saturday, 18 December 2021 03:43:50 Brasilia Standard Time"
Date().localizedDescription(date: .full, time: .full, in: .gmt)  // "Saturday, 18 December 2021 06:43:50 Greenwich Mean Time"
Date().localizedDescription(date: .full, time: .full, locale: .ptBR)  // "sábado, 18 de dezembro de 2021 03:43:50 Horário Padrão de Brasília"

extension Date {

    var fullDate: String { localizedDescription(date: .full, time: .none) }
    var longDate: String { localizedDescription(date: .long, time: .none) }
    var mediumDate: String { localizedDescription(date: .medium, time: .none) }
    var shortDate: String { localizedDescription(date: .short, time: .none) }

    var fullTime: String { localizedDescription(date: .none, time: .full) }
    var longTime: String { localizedDescription(date: .none, time: .long) }
    var mediumTime: String { localizedDescription(date: .none, time: .medium) }
    var shortTime: String { localizedDescription(date: .none, time: .short) }

    var fullDateTime: String { localizedDescription(date: .full, time: .full) }
    var longDateTime: String { localizedDescription(date: .long, time: .long) }
    var mediumDateTime: String { localizedDescription(date: .medium, time: .medium) }
    var shortDateTime: String { localizedDescription(date: .short, time: .short) }
}

print(Date().fullDate)  // "Saturday, 18 December 2021\n"
print(Date().shortDate)  // "18/12/21\n"

print(Date().fullTime)  // "03:43:50 Brasilia Standard Time\n"
print(Date().shortTime)  // "03:43\n"

print(Date().fullDateTime)  // "Saturday, 18 December 2021 03:43:50 Brasilia Standard Time\n"
print(Date().shortDateTime)  // "18/12/21 03:43\n"

同时可以添加 var shortDateTime: String { return "(self.shortDate) (self.shortTime)" } - Booyah
这很酷。如何从特定的“UTC偏移量”获取日期/时间? - Codetard
只需传递所需的时区即可使用localizedDescription方法。 - Leo Dabus
如何添加毫秒? - alpha47
没有timeStyle选项可以添加毫秒,但是您可以使用DateFormatter的方法setLocalizedDateFormatFromTemplate设置自定义本地化dateFormat,并传递毫秒组件SSS,例如:dateFormatter.setLocalizedDateFormatFromTemplate("HHmmssSSS") - Leo Dabus

25

SWIFT 4或5

extension Date {

 static func getCurrentDate() -> String {

        let dateFormatter = DateFormatter()

        dateFormatter.dateFormat = "dd/MM/yyyy HH:mm:ss"

        return dateFormatter.string(from: Date())

    }
}

使用

print(Date.getCurrentDate())

2
很多人在stackoverflow上忘记给出用法,他们只是定义... 很棒的答案!! - DragonFire
1
每次调用此方法都会创建一个新的日期格式化程序。 - Leo Dabus

17

Swift 3.0更新:Date创建一个扩展(extension)

extension Date {
    func string(format: String) -> String {
        let formatter = DateFormatter()
        formatter.dateFormat = format
        return formatter.string(from: self)
    }
}

使用方法:

Date().string(format: "yyyy-MM-dd")

Swift 2.2:NSDate创建一个扩展

extension NSDate {  
    func dateStringWithFormat(format: String) -> String {
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = format
        return dateFormatter.stringFromDate(self)
    }   
}

使用方法:

NSDate().dateStringWithFormat("yyyy-MM-dd")

每次调用此方法都会创建一个新的DateFormatter。 - Leo Dabus
顺便提一下,当使用大多数固定日期格式时,您应该将区域设置设置为“en_US_POSIX”,否则您的“DateFormatter”将受到用户设备区域设置的影响。 extension Date { static let formatter: DateFormatter = { let formatter = DateFormatter() formatter.locale = Locale(identifier: "en_US_POSIX") return formatter }() func string(format: String) -> String { Date.formatter.dateFormat = format return Date.formatter.string(from: self) } } - Leo Dabus

10

你可以创建一个扩展,方便地将String转换为NSDate

extension NSDate {
    func dateFromString(date: String, format: String) -> NSDate {
        let formatter = NSDateFormatter()
        let locale = NSLocale(localeIdentifier: "en_US_POSIX")

        formatter.locale = locale
        formatter.dateFormat = format

        return formatter.dateFromString(date)!
    }
}

在你的函数中,你可以使用 NSDate().dateFromString("2015-02-04 23:29:28", format: "yyyy-MM-dd HH:mm:ss"),这应该可以正常工作。输入日期不需要与输出日期格式相同。

func getCurrentShortDate() -> String {
    var todaysDate = NSDate().dateFromString("2015-02-04 23:29:28", format:  "yyyy-MM-dd HH:mm:ss")

    var dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "dd-MM-yyyy"
    var DateInFormat = dateFormatter.stringFromDate(todaysDate)

    return DateInFormat
}

println(getCurrentShortDate())

输出结果为04-02-2015


8

Swift 3

使用 @doovers 创建的扩展和来自此网站的格式字符串,您可以得到以下结果:

extension Date {
    func string(format: String) -> String {
        let formatter = DateFormatter()
        formatter.dateFormat = format
        return formatter.string(from: self)
    }
}

用法:

Date().string(format: "EEEE, MMM d, yyyy") // Saturday, Oct 21, 2017
Date().string(format: "MM/dd/yyyy")        // 10/21/2017
Date().string(format: "MM-dd-yyyy HH:mm")  // 10-21-2017 03:31

Date().string(format: "MMM d, h:mm a")     // Oct 21, 3:31 AM
Date().string(format: "MMMM yyyy")         // October 2017
Date().string(format: "MMM d, yyyy")       // Oct 21, 2017

Date().string(format: "E, d MMM yyyy HH:mm:ss Z") // Sat, 21 Oct 2017 03:31:40 +0000
Date().string(format: "yyyy-MM-dd'T'HH:mm:ssZ")   // 2017-10-21T03:31:40+0000
Date().string(format: "dd.MM.yy")                 // 21.10.17

您也可以像这样将毫秒传递给日期对象:
Date(1508577868947).string(format: "EEEE, MMM d, yyyy") // Saturday, Oct 21, 2017

每次调用此方法都会创建一个新的日期格式化程序。 - Leo Dabus

4

这是苹果建议的方式

    let formatter = DateFormatter()
    formatter.locale = Locale.current
    formatter.dateStyle = .short
    let dateString = formatter.string(from: date)

如果预定义的格式 .short、.medium、.long 和 .full 恰好合适,请在本地创建模板。

    let formatter = DateFormatter()
    formatter.locale = Locale.current
    formatter.setLocalizedDateFormatFromTemplate("MM/dd/yyyy")
    let dateString = formatter.string(from: date)

这是链接

4
 let dateformatter1 = DateFormatter()
    dateformatter1.dateFormat = "ccc, d MMM yyy"

    let dateString1 = dateformatter1.string(from: datePicker.date)
    print("Date Selected \(dateString1)")
    labelDate.text = dateString1

    let dateformatter2 = DateFormatter()
    dateformatter2.dateFormat = "dd-MM-yyyy"
    let dateString2 = dateformatter2.string(from: datePicker.date)
    print("Date Selected \(dateString2)")


    let dateformatter3 = DateFormatter()
    dateformatter3.dateFormat = "dd/MM/yyyy"
    let dateString3 = dateformatter3.string(from: datePicker.date)
    print("Date Selected \(dateString3)")

    let dateformatter4 = DateFormatter()
    dateformatter4.dateFormat = "dd MMMM yyyy hh:mm a"
    let dateString4 = dateformatter4.string(from: datePicker.date)
    print("Date Selected \(dateString4)") 

我参考了Codzify.com上的这篇文章。非常有帮助。

2

这是一种最简单的更改日期格式的方法。

1. 创建一个Swift类来扩展日期。

extension Date {
    func today(format : String = "yyyy-MM-dd'T'HH:mm:ss.SSS") -> String {
        let formatter = DateFormatter()
        formatter.dateFormat = format
        return formatter.string(from: self)
    }
} 
  1. 如何使用扩展。

    let date = Date().today(format: "dd/MM/yy HH:mm:ss")

    print(date)


这是错误的。YYYY 是用于周年的年份。你需要使用 yyyy。此外,创建一个 DateFormatter 是“昂贵”的。这将在每次调用此方法时创建一个新的日期格式化程序。其次,在使用固定日期格式时,您应始终在设置 dateFormat 之前将日期格式化程序的区域设置为“en_US_POSIX”。 - Leo Dabus
尝试使用以下代码进行翻译:DateComponents(calendar: .current, year: 2022, month: 1, day: 1).date!.today() // "2021-12-18T03:21:18.422"。您正在创建一个实例方法,并且正在放弃 self。如果日期不重要,只是为了今天,请将其声明为 static。使用方式如下Date.today() - Leo Dabus
如果您想将其保留为实例方法并更改为return formatter.string(from: self),请确保修复年份,否则DateComponents(calendar: .current, year: 2022, month: 1, day: 1).date!.today()将导致结果为"2021-01-01T00:00:00.000" - Leo Dabus
1
我还会将时区添加到默认的dateFormat "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" 中,并将其设置为UTC(与GMT相差零秒)。请查看此帖子 - Leo Dabus
1
你仍在使用 YYYY,这是错误的。当日期在一年的第一周或最后一周时,这将导致错误的年份。你应该使用 yyyy - Leo Dabus
@LeoDabus 这只是一个示例。您可以根据自己的需求进行定制并获得结果。 - Parth Patel

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