如何在IOS Swift中获取当前的美国东部时间

3

我需要在我的应用程序中比较两个日期,我有一个东部标准时间(EST)的日期与当前日期进行比较,但是let today = NSDate() 返回的是协调世界时(UTC)的日期,如何获取当前的EST时间或将其转换为EST?


你是想要比较到小时的日期还是仅仅比较到日的日期? - Aaron
1
你能展示一下你的EST日期吗?它是字符串格式还是NSDate格式? - Nirav D
3个回答

3
NSDate存储时间的绝对时刻,即使您创建日期时使用 compare 方法,它也会尊重时区(因为从未存储过时区)。您可以将NSDate视为始终从协调世界时(UTC)的00:00:00,1970年1月1日,星期四计算的时代时间。

我不知道NSDate的实现方式,可能是在内部以UTC格式存储日期。

它是我们的实现(NSDateFormatter),根据我们的要求更改其格式。

因此,无论您如何创建日期,使用compareNSCalendar,它们都会比较日期。

例如:我的本地时区是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

7
我想提醒一下,如果当前东海岸时区处于夏令时(EDT)状态,则获取“EST”时区的日期会失败。最好使用formatter.timeZone = TimeZone(identifier: "America/New_York"),可以同时考虑EDT和EST。 - Adam Freeman

1
尝试这个 -
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中的两个日期,我该怎么做? - Vishnu

0

时区问题是因为当您打印Date()时,您得到的值是UTC区域的值。(GMT + 00:00)。

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

  1. 了解您所在时区与UTC时间之间的时间差。如果您不确定,请搜索一下,您会得到时间差。

例如:我来自印度,时差为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分钟转换为秒,并添加了该时间间隔。

    它对我起作用了。希望你也觉得有用!


  • 网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接