我需要在我的应用程序中比较两个日期,我有一个东部标准时间(EST)的日期与当前日期进行比较,但是let today = NSDate()
返回的是协调世界时(UTC)的日期,如何获取当前的EST时间或将其转换为EST?
NSDate
存储时间的绝对时刻,即使您创建日期时使用 compare
方法,它也会尊重时区(因为从未存储过时区)。您可以将NSDate
视为始终从协调世界时(UTC)的00:00:00,1970年1月1日,星期四计算的时代时间。
我不知道NSDate
的实现方式,可能是在内部以UTC
格式存储日期。
它是我们的实现(NSDateFormatter
),根据我们的要求更改其格式。
因此,无论您如何创建日期,使用compare
或NSCalendar
,它们都会比较日期。
例如:我的本地时区是IST,现在是2016-10-21 12:10:00
在美国东部时间(EST)是2016-10-21 02:40:00,
在太平洋标准时间(PST)这里现在是2016-10-20 23:40:00
所以这段代码:
let today = NSDate()
print("\(today)")
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
formatter.timeZone = TimeZone(abbreviation: "EST")
let estDate = formatter.date(from: "2016-10-21 02:40:00")
print("\(estDate!)")
formatter.timeZone = TimeZone(abbreviation: "PST")
let pstDate = formatter.date(from: "2016-10-20 23:40:00")
print("\(pstDate!)")
formatter.timeZone = TimeZone(abbreviation: "IST")
let istDate = formatter.date(from: "2016-10-21 12:10:00")
print("\(istDate!)")
因为在任何地方都是同一时刻,所以会同时打印。
2016-10-21 06:40:00 +0000
2016-10-21 06:40:00 +0000
2016-10-21 06:40:00 +0000
2016-10-21 06:40:00 +0000
import UIKit
let date = Date();
let formatter = DateFormatter();
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss ZZZ"
let defaultTimeZoneStr = formatter.string(from: date)
formatter.timeZone = TimeZone(abbreviation: "UTC")
let utcTimeZoneStr = formatter.string(from: date)
// Date comparision to compare current date and end date.
var dateComparisionResult:NSComparisonResult = NSDate().compare(endDate)
if dateComparisionResult == NSComparisonResult.OrderedAscending
{
// Current date is smaller than end date.
}
else if dateComparisionResult == NSComparisonResult.OrderedDescending
{
// Current date is greater than end date.
}
else if dateComparisionResult == NSComparisonResult.OrderedSame
{
// Current date and end date are same.
}
var timeZoneAbbreviationsType: [String:String] { return TimeZone.abbreviationDictionary }
timeZoneAbbreviationsType // ["CEST": "Europe/Paris", "WEST": "Europe/Lisbon", "CDT": "America/Chicago", "EET": "Europe/Istanbul", "BRST": "America/Sao_Paulo", "EEST": "Europe/Istanbul", "CET": "Europe/Paris", "MSD": "Europe/Moscow", "MST": "America/Denver", "KST": "Asia/Seoul", "PET": "America/Lima", "NZDT": "Pacific/Auckland", "CLT": "America/Santiago", "HST": "Pacific/Honolulu", "MDT": "America/Denver", "NZST": "Pacific/Auckland", "COT": "America/Bogota", "CST": "America/Chicago", "SGT": "Asia/Singapore", "CAT": "Africa/Harare", "BRT": "America/Sao_Paulo", "WET": "Europe/Lisbon", "IST": "Asia/Calcutta", "HKT": "Asia/Hong_Kong", "GST": "Asia/Dubai", "EDT": "America/New_York", "WIT": "Asia/Jakarta", "UTC": "UTC", "JST": "Asia/Tokyo", "IRST": "Asia/Tehran", "PHT": "Asia/Manila", "AKDT": "America/Juneau", "BST": "Europe/London", "PST": "America/Los_Angeles", "ART": "America/Argentina/Buenos_Aires", "PDT": "America/Los_Angeles", "WAT": "Africa/Lagos", "EST": "America/New_York", "BDT": "Asia/Dhaka", "CLST": "America/Santiago", "AKST": "America/Juneau", "ADT": "America/Halifax", "AST": "America/Halifax", "PKT": "Asia/Karachi", "GMT": "GMT", "ICT": "Asia/Bangkok", "MSK": "Europe/Moscow", "EAT": "Africa/Addis_Ababa"]
时区问题是因为当您打印Date()时,您得到的值是UTC区域的值。(GMT + 00:00)。
现在要将其转换为本地日期,请执行以下步骤。
例如:我来自印度,时差为5小时30分钟。 IST是GMT + 05:30。
将该时间间隔添加到标准 UTC 日期中。
扩展 Date {
static func getCurrentDate() -> Date
{
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"
let curr = Date().addingTimeInterval(TimeInterval((5*3600) + (30*60)))
return curr
}
}
这里,5 * 3600 是为五小时,30*60 是为30分钟的差异。 所以,我基本上将5小时30分钟转换为秒,并添加了该时间间隔。
它对我起作用了。希望你也觉得有用!