【问题标题】:How do I get the current Date in short format in Swift如何在 Swift 中以短格式获取当前日期
【发布时间】:2015-04-04 15:47:12
【问题描述】:

在下图中你可以看到我写的代码和所有变量的值:

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

    return DateInFormat
}

Variable values

如您所见,当前日期没有问题,但是当我尝试将 NSDate 更改为字符串时,它就不会这样做。

【问题讨论】:

  • 1.不要感到羞耻。每个人都从某个地方开始。 2. 将代码直接粘贴到您的帖子中,而不是发布图片
  • 你能做一个 println(DateInFormat) 并证明字符串是空的吗?
  • 有些奇怪。让那段特定的代码失败应该是相当困难的。这可能是调试器问题——Xcode 调试器的变量显示内容非常不稳定,不值得信任。
  • @Aggressor - 那应该是println(DateInFormat)
  • 修正谢谢,(读错名字)

标签: swift date nsdate nsdateformatter dateformatter


【解决方案1】:

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)" }
  • 这很酷。从特定的UTC Offset 获取日期/时间怎么样?
  • 只需为本地化描述方法传递所需的时区
  • 怎么加毫秒?
  • 没有添加毫秒的timeStyle 选项,但您可以使用DateFormatter 的方法setLocalizedDateFormatFromTemplate 设置自定义本地化dateFormat,并传递毫秒组件SSS,如果需要: dateFormatter.setLocalizedDateFormatFromTemplate("HHmmssSSS")
【解决方案2】:

Swift 3.0 更新:Date创建扩展

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。
  • 顺便说一句,在使用大多数固定日期格式时,您应该将您的语言环境设置为"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) } }
【解决方案3】:

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

【讨论】:

  • 很多人在stackoverflow上忘记给出用法,他们只定义......很好的答案!
  • 这将在您每次调用此方法时创建一个新的日期格式化程序。
【解决方案4】:

您可以创建一个扩展来轻松地将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

【讨论】:

    【解决方案5】:

    斯威夫特 3

    使用@doovers 创建的扩展名和来自此website 的一些格式字符串,您将获得以下信息:

    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
    

    【讨论】:

    • 这将在您每次调用此方法时创建一个新的日期格式化程序。
    【解决方案6】:

    这是 Apple 建议的方式

        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)
    

    这是link

    【讨论】:

      【解决方案7】:

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

      1.为 Date 扩展创建一个 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. 如何使用扩展。

        让 date = Date().today(格式: "dd/MM/yy HH:mm:ss")

        打印(日期)

      【讨论】:

      • 这是错误的。 YYYY 代表 YearForWeekOfYear。您需要使用yyyy。除此之外,创建 DateFormatter 是“昂贵的”。这将在您每次调用此方法时创建一个新的日期格式化程序。其次,在使用固定日期格式时,在设置 dateFormat 之前,应始终将日期格式化程序的语言环境设置为“en_US_POSIX”。
      • 试试这个DateComponents(calendar: .current, year: 2022, month: 1, day: 1).date!.today() // "2021-12-18T03:21:18.422" 你正在创建一个实例方法并丢弃 self.如果日期无关紧要,则仅在今天将其声明为静态。用法为Date.today()
      • 如果您想将其保留为实例方法并将其更改为return formatter.string(from: self),请确保修复年份,否则DateComponents(calendar: .current, year: 2022, month: 1, day: 1).date!.today() 将导致"2021-01-01T00:00:00.000"
      • 我还将时区添加到默认的 dateFormat "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" 并将其设置为 UTC(距 GMT 零秒)。检查这个post
      • 您仍在使用YYYY,这是错误的。当日期在一年的第一周或最后一周时,这将导致错误的年份。你应该再次使用yyyy
      【解决方案8】:
       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 上提到了这篇文章。真的很有帮助。

      【讨论】:

        猜你喜欢
        • 2017-11-18
        • 2013-08-17
        • 2011-06-29
        • 2017-04-28
        • 1970-01-01
        • 2020-10-16
        • 2012-11-12
        • 2013-10-04
        • 2011-12-06
        相关资源
        最近更新 更多