Swift - 获取当地日期和时间

Moh*_*din 20 nsdate ios swift

如何在Swift中获取本地日期和时间?

let last_login = String(NSDate.date())
Run Code Online (Sandbox Code Playgroud)

Leo*_*bus 47

更新:Xcode 8.2.1•Swift 3.0.2

您还可以使用Date方法description(with locale: Locale?)获取用户的本地化时间描述:

Date的字符串表示形式,使用给定的语言环境,或者locale参数为nil,采用国际格式YYYY-MM-DD HH:MM:SS±HHMM,其中±HHMM表示以小时和分钟为单位的时区偏移量UTC(例如,"2001-03-24 10:45:32 +0600").

description(使用locale:Locale?)

Date().description(with: .current)   // "Monday, February 9, 2015 at 05:47:51 Brasilia Summer Time"
Run Code Online (Sandbox Code Playgroud)

上面的方法并不意味着在向用户显示日期和时间时使用.它仅用于调试目的.

向用户显示本地日期和时间(当前时区)时,您应该尊重用户区域设置和设备设置.您唯一可以控制的是日期和时间样式(短,中,长或完整).有关更多信息,您可以查看此帖子shortDateTime.

如果您的目的是为编码目的创建时间戳UTC(iso8601),您可以查看此帖子iso8601

  • 你统治.为什么不是每个人都这样做? (4认同)

laj*_*eme 16

如果您想获取Date 对象而不是字符串表示,您可以使用以下代码段:

extension Date {
    func localDate() -> Date {
        let nowUTC = Date()
        let timeZoneOffset = Double(TimeZone.current.secondsFromGMT(for: nowUTC))
        guard let localDate = Calendar.current.date(byAdding: .second, value: Int(timeZoneOffset), to: nowUTC) else {return Date()}

        return localDate
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

let now = Date().localDate()
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是处理日期的错误方法。不要这样做。正如 Leo Dabus 在他的评论中所说,Date 对象捕获时间上的一个时刻,与时区无关,并且将日期强制为显示 UTC 正确时间的不同日期是完全错误的。 (7认同)
  • 从文档 **日期值封装单个时间点,独立于任何特定的日历系统或时区。日期值表示相对于绝对参考日期的时间间隔。** (3认同)
  • 使用“self”而不是 nowUTC 否则没有创建扩展函数的意义 (2认同)

Sco*_*des 8

狮子座的回答很棒。我只是想添加一种将其用作计算属性的方法。

 var currentTime: String { 
     Date().description(with: .current) 
 }
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

print(currentTime)
Run Code Online (Sandbox Code Playgroud)

或者你可以封装它:

extension String { 
    static var currentTime: String { 
        Date().description(with: .current) 
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以在任何使用字符串的地方使用它:

var time: String = .currentTime
Run Code Online (Sandbox Code Playgroud)


Vik*_*ica 6

通过设置格式使用NSDateFormatter

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "hh:mm"
println(dateFormatter.stringFromDate(NSDate()))
Run Code Online (Sandbox Code Playgroud)

或风格

dateFormatter.dateStyle = .NoStyle
dateFormatter.timeStyle = .MediumStyle
Run Code Online (Sandbox Code Playgroud)


Moh*_*din 6

我已经找到了答案.

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MM-dd-yyyy HH:mm"
let dateInFormat = dateFormatter.stringFromDate(NSDate())
Run Code Online (Sandbox Code Playgroud)

  • 如何获取Date对象而不是字符串 (8认同)

War*_*shi 5

let expiryDate: Date = ...
let localizedDateString = DateFormatter.localizedString(from: expiryDate, dateStyle: .medium, timeStyle: .short)
Run Code Online (Sandbox Code Playgroud)

“2017 年 9 月 10 日,14:37”


bso*_*sod 5

找回最常见的字符串格式(在处理查询和数据库时):

斯威夫特 4、5

2019-01-09T01:07:04Z(格林威治标准时间/祖鲁时间的RFC3339)

let f = ISO8601DateFormatter()
f.formatOptions = [.withInternetDateTime]
let s = f.string(from: Date())
Run Code Online (Sandbox Code Playgroud)

2019-01-08T17:04:16-08:00(RFC3339 考虑本地时区)

let f = ISO8601DateFormatter()
f.formatOptions = [.withInternetDateTime]
f.timeZone = TimeZone.current
let s = f.string(from: Date())
Run Code Online (Sandbox Code Playgroud)

2019-01-09(格林威治标准时间/祖鲁时间的标准日期戳)

let f = ISO8601DateFormatter()
f.formatOptions = [.withFullDate, .withDashSeparatorInDate]
let s = f.string(from: Date())
Run Code Online (Sandbox Code Playgroud)

2019-01-08(本地时区的标准日期戳记)

let f = ISO8601DateFormatter()
f.formatOptions = [.withFullDate, .withDashSeparatorInDate]
f.timeZone = TimeZone.current
let s = f.string(from: Date())
Run Code Online (Sandbox Code Playgroud)

所有四个字符串都代表完全相同的时间点。请记住,按字母顺序对这些字符串进行排序也会按时间顺序对它们进行排序,这使得该数据数据库不可知(我一直致力于此)。


Zgp*_*ace 5

在 @lajosdeme 的基础上使用 swift 5 重构答案。我的位置在中国。

import Foundation

let date = Date() // It is not the local time, less than 8 hours
print(date)  // 2022-08-05 08:04:20 +0000

extension Date {
    static func localDate() -> Date {
        let nowUTC = Date()
        let timeZoneOffset = Double(TimeZone.current.secondsFromGMT(for: nowUTC))
        guard let localDate = Calendar.current.date(byAdding: .second, value: Int(timeZoneOffset), to: nowUTC) else {
            return nowUTC
        }
        return localDate
    }
}
// It is the local time
print(Date.localDate()) // 2022-08-05 16:04:20 +0000
Run Code Online (Sandbox Code Playgroud)