Swift - iOS - 不同格式的日期和时间

Gio*_*ioB 38 timestamp nsdateformatter ios swift

我正在为一个用swift编写的应用程序工作,我想操纵日期和时间

let timestamp = NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .ShortStyle, timeStyle: .ShortStyle)
Run Code Online (Sandbox Code Playgroud)

回报

2/12/15, 11:27 PM
Run Code Online (Sandbox Code Playgroud)

如果我想要一个不同格式的日期和时间,例如欧洲格式的日期,如dd/mm/yy和没有AM和PM的24小时格式的小时,我可以使用一些功能,或者我必须使用N字符串重新排序各种元素?

idr*_*dız 58

func convertDateFormater(date: String) -> String {   
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
    dateFormatter.timeZone = NSTimeZone(name: "UTC")

    guard let date = dateFormatter.dateFromString(date) else {
        assert(false, "no date from string")
        return ""
    }

    dateFormatter.dateFormat = "yyyy MMM EEEE HH:mm"
    dateFormatter.timeZone = NSTimeZone(name: "UTC")
    let timeStamp = dateFormatter.stringFromDate(date)

    return timeStamp
}
Run Code Online (Sandbox Code Playgroud)

编辑Swift 4

func convertDateFormatter(date: String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"//this your string date format
    dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone!
    dateFormatter.locale = Locale(identifier: "your_loc_id")
    let convertedDate = dateFormatter.date(from: date)

    guard dateFormatter.date(from: date) != nil else {
        assert(false, "no date from string")
        return ""
    } 

    dateFormatter.dateFormat = "yyyy MMM HH:mm EEEE"///this is what you want to convert format
    dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone!
    let timeStamp = dateFormatter.string(from: convertedDate!)

    return timeStamp
}
Run Code Online (Sandbox Code Playgroud)

  • 您应该为答案添加更多解释.粘贴代码不是stackoverflow风格:) (16认同)
  • 这看起来是一个很好的方法,但是该函数要求日期输入为String.大多数时候你都会开始使用NSDate.在传入此函数之前,格式化为String的最佳方法是什么? (4认同)

Leo*_*bus 29

如前所述,您必须使用DateFormatter格式化Date对象.最简单的方法是创建一个只读的计算属性Date扩展名.


只读计算属性

具有getter但没有setter的计算属性称为只读计算属性.只读计算属性始终返回一个值,可以通过点语法访问,但不能设置为其他值.

注意:

必须使用var关键字将计算属性(包括只读计算属性)声明为变量属性,因为它们的值不固定.let关键字仅用于常量属性,以指示一旦将它们设置为实例初始化的一部分,就无法更改它们的值.

您可以通过删除get关键字及其大括号来简化只读计算属性的声明:


extension Formatter {
    static let date = DateFormatter()
}
Run Code Online (Sandbox Code Playgroud)
extension Date {
    var europeanFormattedEn_US : String {
        Formatter.date.calendar = Calendar(identifier: .iso8601)
        Formatter.date.locale   = Locale(identifier: "en_US_POSIX")
        Formatter.date.timeZone = .current
        Formatter.date.dateFormat = "dd/M/yyyy, H:mm"
        return Formatter.date.string(from: self)
    }
}
Run Code Online (Sandbox Code Playgroud)

要将其转换回来,您可以创建另一个只读的计算属性,但作为字符串扩展名:

 extension String {
    var date: Date? {
        return Formatter.date.date(from: self)
    }
    func dateFormatted(with dateFormat: String = "dd/M/yyyy, H:mm", calendar: Calendar = Calendar(identifier: .iso8601), defaultDate: Date? = nil, locale: Locale = Locale(identifier: "en_US_POSIX"), timeZone: TimeZone = .current) -> Date? {
        Formatter.date.calendar = calendar
        Formatter.date.defaultDate = defaultDate ?? calendar.date(bySettingHour: 12, minute: 0, second: 0, of: Date())
        Formatter.date.locale = locale
        Formatter.date.timeZone = timeZone
        Formatter.date.dateFormat = dateFormat
        return Formatter.date.date(from: self)
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

let dateFormatted = Date().europeanFormattedEn_US         //"29/9/2018, 16:16"
if let date = dateFormatted.date {
    print(date.description(with:.current)) // Saturday, September 29, 2018 at 4:16:00 PM Brasilia Standard Time\n"\
    date.europeanFormattedEn_US                         // "29/9/2018, 16:27"
}
Run Code Online (Sandbox Code Playgroud)
let dateString = "14/7/2016"
if let date = dateString.toDateFormatted(with: "dd/M/yyyy") {
    print(date.description(with: .current))
 // Thursday, July 14, 2016 at 12:00:00 PM Brasilia Standard Time\n"
}
Run Code Online (Sandbox Code Playgroud)

  • 我不会删除我的答案,因为你不喜欢它 (12认同)
  • 因为它使您的代码更有条理,更清晰,更易读 (7认同)
  • 为什么扩展,简单的方法有问题? (4认同)

Jer*_*ope 12

正如扎普所说,你需要遵循文件.不可否认,与其他类引用相比,它可能不是最直接的.简短的回答是,您使用日期字段符号表来确定您想要的格式.一旦你这样做:

let dateFormatter = NSDateFormatter()
//the "M/d/yy, H:mm" is put together from the Symbol Table
dateFormatter.dateFormat = "M/d/yy, H:mm"
dateFormatter.stringFromDate(NSDate())
Run Code Online (Sandbox Code Playgroud)

如果需要将字符串日期转换为NSDate,您还需要能够使用该表.

let dateAsString = "02/12/15, 16:48"
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "M/d/yyyy, H:mm"
let date = dateFormatter.dateFromString(dateAsString)
Run Code Online (Sandbox Code Playgroud)


Ati*_*ood 10

格式化字符串的当前日期时间:

let currentDate = Date()
let dateFormatter = DateFormatter()

dateFormatter.dateFormat = "dd/MM/yyyy hh:mm:ss a"
let convertedDate: String = dateFormatter.string(from: currentDate) //08/10/2016 01:42:22 AM
Run Code Online (Sandbox Code Playgroud)

更多日期时间格式


big*_*ble 5

在一处添加了一些格式。希望有人得到帮助。

Xcode 12 - 斯威夫特 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)
Run Code Online (Sandbox Code Playgroud)


zap*_*aph 4

您已经找到了NSDateFormatter,只需阅读其文档即可。

NSDateFormatter 类参考

有关格式字符定义,
请参阅:ICU 格式化日期和时间
另请参阅:日期字段符号表。