【问题标题】:How to get Current EST time IOS Swift如何获取当前 EST 时间 IOS Swift
【发布时间】:2016-10-21 05:44:45
【问题描述】:

我需要在我的应用程序中比较两个日期,并且我有一个 EST 日期来与当前日期进行比较,但是 let today = NSDate() 以 UTC 格式返回日期,我如何获取当前 EST 时间或转换为 EST ?

【问题讨论】:

  • 您是要比较一直到整点的日期,还是要比较简单到当天的日期?
  • 你能显示你的 EST 日期吗?是字符串格式还是 NSDate?

标签: ios iphone swift ipad nsdate


【解决方案1】:

NSDate 将时间存储在绝对时刻,即,无论您使用NSDatecompare 方法创建的日期是在哪个时区,它都会尊重时区(因为从未存储时区)。您可以将 NSDate 视为纪元时间,它始终从 1970 年 1 月 1 日星期四 00:00:00 协调世界时 (UTC) 开始计算

我不知道NSDate 的实现可能是将日期存储在UTC 内部。

是我们的实现 (NSDateFormatter) 将其格式更改为我们的要求。

因此,无论您使用compare 还是NSCalendar,无论您如何创建日期,他们都会比较您的日期

例如我的本地时区是 IST,现在是 2016-10-21 12:10:00

美国东部标准时间是 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

【讨论】:

  • 我只是想补充一点,如果当前东海岸时区在夏令时的“EDT”中,获取“EST”时区的日期将会失败。最好使用同时尊重 EDT 和 EST 的 formatter.timeZone = TimeZone(identifier: "America/New_York")。
【解决方案2】:

试试这个-

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"]

【讨论】:

  • 我需要在 ETC 中获取两个日期,我该怎么做?
【解决方案3】:

时区问题是因为当您打印 Date() 时,您得到的值是 UTC 时区。 (格林威治标准时间 + 00:00)。

现在要将其转换为您的本地日期,请执行以下步骤。

  1. 了解您所在区域与 UTC 时间之间的时差。如果您不确定,只需 google 一下,您就会知道时差。

例如:我来自印度,时差是 5 小时 30 分钟。 IST 是 GMT + 05:30。

  1. 将该时间间隔添加到标准 UTC 日期。

      extension 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 是 5 小时,30*60 是 30 分钟的差异。 所以,我基本上是以秒为单位转换 5 小时 30 分钟并添加该时间间隔。

    它对我有用。希望你也觉得这很有用!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    相关资源
    最近更新 更多