Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift-获取本地日期和时间_Ios_Swift_Date_Nsdate - Fatal编程技术网

Ios Swift-获取本地日期和时间

Ios Swift-获取本地日期和时间,ios,swift,date,nsdate,Ios,Swift,Date,Nsdate,如何在Swift中获取本地日期和时间 let last_login = String(NSDate.date()) 通过设置格式或 let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "hh:mm" println(dateFormatter.stringFromDate(NSDate())) 还是风格 dateFormatter.dateStyle = .NoStyle dateFormatter.timeSty

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

let last_login = String(NSDate.date())

通过设置格式或

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "hh:mm"
println(dateFormatter.stringFromDate(NSDate()))
还是风格

dateFormatter.dateStyle = .NoStyle
dateFormatter.timeStyle = .MediumStyle

您必须使用NSDateFormatter

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MMMM dd, yyyy HH:mm"
dateFormatter.locale = "en" // Change "en" to change the default locale if you want  
let stringDate = dateFormatter.stringFromDate(date)

更新:Xcode 8.2.1•Swift 3.0.2

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

日期的字符串表示形式,使用给定的语言环境,或者如果语言环境 参数为零,国际格式为YYYY-MM-DD HH:MM:SS ±HHMM,其中±HHMM表示时区偏移,单位为小时和 UTC的分钟数(例如,“2001-03-2410:45:32+0600”)

上面的方法不适用于向用户显示日期和时间。它仅用于调试目的

当向用户显示本地日期和时间(当前时区)时,您应该尊重用户的区域设置和设备设置。唯一可以控制的是日期和时间样式(短、中、长或全)。更多关于这方面的信息,你可以查看这篇文章


如果您打算创建一个UTC时间戳用于编码(iso8601),您可以查看这篇文章,我已经找到了答案

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "MM-dd-yyyy HH:mm"
let dateInFormat = dateFormatter.stringFromDate(NSDate())

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

利奥的回答很好。我只是想添加一种将其用作计算属性的方法

 var currentTime: String { 
     Date().description(with: .current) 
 }
像这样使用它:

print(currentTime)
或者您可以封装它:

extension String { 
    static var currentTime: String { 
        Date().description(with: .current) 
    }
}
然后您可以在任何使用字符串的地方使用它:

var time: String = .currentTime
斯威夫特4 获取当前日期和时间的步骤

let currentDate = Date()
print(currentDate) //this will return current date and time 
但这将是日期类型,用于将日期转换为字符串

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd-MM-yyyy HH:mm" //give the formate according to your need
let dateStr =  dateFormatter.string(from: currentDate) //which will give the string of current date and time in required dateformate

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

Swift 4

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

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

2019-01-09(GMT/Zulu时间的标准日期戳)

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


所有四个字符串表示完全相同的日期和时间。不要忘记,按字母顺序对这些字符串(以这些格式)进行排序会使它们按时间顺序排列,这意味着不需要将它们作为日期对象存储在数据库中,因为您可以使用基本的a-to-z排序按时间顺序进行排序和查询。

Swift 5
如果要手动执行此操作,
Date()将始终返回当前UTC时间

let today = Date()  
如果你住在马来西亚。UTC+8(意味着快8小时)
您可以使用日历获取本地日期时间

let localDateTime = Calendar.current.date(byAdding: .hour, value: 8, today)!   
您可以使用的另一种方法是

let localDateTime = Date().addingTimeInterval(8 * 60 * 60) //because the param in seconds
如果要获取日期对象而不是字符串表示,可以使用以下代码段:

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
    }
}
像这样使用它:

let now = Date().localDate()

找到了一个非常好的网站来帮助您了解格式字符串:如何获取日期对象而不是stringdateFormatter.DateFormatte?dd-MM-yyy-HH:MM?您好,如何将这个巨大的字符串转换为简单的日期??dd/MM/yyyy HH:MM:ss??您是要将其显示给用户还是将其作为iso8601日期字符串发送到服务器?上述方法仅用于调试目的。这个@LeoDabus是否可以将巴西利亚夏季时间显示为BST?我认为硬编码额外的时间对于任何生产应用程序都不太实际,因为您的用户很可能来自不同的国家。不,不,不,不!不要将时间偏移添加到日期对象,然后以GMT显示它们。这是一种非常糟糕的方法。创建一个DateFormatter并将其设置为所需的时区。要这样调用它,需要将变量currentTime声明为静态。@LeoDabus是否需要详细说明?日期只是一个时间点。它没有时区(实际上是从2001年1月1日UTC 00:00:00开始的秒数)。只有日期的字符串表示形式可以具有时区。从文档中,日期值封装了单个时间点,与任何特定的日历系统或时区无关。日期值表示相对于绝对参考日期的时间间隔。因此,如果您想理解我的意思,请尝试
让localDate=Date().localDate()
然后
打印(localDate.description(with:.current))
并检查结果。此答案是处理日期的错误方法。不要这样做。正如Leo Dabus在评论中所说,Date对象捕获时间上的某个时刻,独立于时区,强制将日期转换为以UTC显示正确时间的不同日期是完全错误的。
let f = ISO8601DateFormatter()
f.formatOptions = [.withFullDate, .withDashSeparatorInDate]
f.timeZone = TimeZone.current
let s = f.string(from: Date())
let today = Date()  
let localDateTime = Calendar.current.date(byAdding: .hour, value: 8, today)!   
let localDateTime = Date().addingTimeInterval(8 * 60 * 60) //because the param in seconds
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
    }
}
let now = Date().localDate()