【问题标题】:Swift 3 timezone issueSwift 3 时区问题
【发布时间】:2023-04-05 04:04:02
【问题描述】:

似乎setDefaultTimeZone 方法在NSTimeZone 中不再可用。有人知道这个的替代品吗?

在我的AppDelegate.swift 中,我有:

NSTimeZone.default = TimeZone(abbreviation: "BST")!

我猜它按预期工作,因为在所有其他文件中,我将 NSTimeZone 设置为此值

现在,在我的 Utils 中,我有这个方法:

static func getDate(_ dateStr: String) -> Date {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"
    // dateFormatter.timeZone = TimeZone(abbreviation: "GMT")
    let date =  dateFormatter.date(from: dateStr)!
    return date
}

所以,可以说,我给它输入2016-10-07,它给我回2016-10-06 23:00。为什么?如果您取消注释上述代码中的行,它会得到修复。我不想到处使用这条线。

例如,在我项目的其他部分,我使用了CVCalendar。它提供了一个像这样获取convertDate的函数

func didSelectDayView(_ dayView: DayView, animationDidFinish: Bool) {
    selectedDay = dayView
    selectedDate = dayView.date.convertedDate()!
}

这里也发生了和以前一样的事情……我点击2016-10-08,这里的selectedDate变成2016-10-07 23:00

NSTimeZone.Default 会在任何地方打印Europe/London

有人知道为什么会这样吗?

【问题讨论】:

  • 你能展示你尝试过的代码吗
  • @Anbu.Karthik 这是我在 Swift3 之前在 AppDelegate.swift 中使用的。 NSTimeZone.setDefaultTimeZone(TimeZone(缩写: "BST")!)
  • @HimanshuMoradiya 我也阅读了这个文档,但是我的 Xcode 失败说 Type NSTimeZone has no member setDefault...。你试过了吗?
  • var UTC = NSTimeZone(name: "UTC") NSTimeZone.defaultTimeZone = UTC 试试这个

标签: ios swift3 nstimezone


【解决方案1】:

像这样试试。

TimeZone.ReferenceType.default = TimeZone(abbreviation: "BST")!

编辑:我已将此TimeZoneDateFormatter 一起使用,并获得了正确的BST 时间和日期。

TimeZone.ReferenceType.default = TimeZone(abbreviation: "BST")!
let formatter = DateFormatter()
formatter.timeZone = TimeZone.ReferenceType.default
formatter.dateFormat = "yyyy-MM-dd HH:mm"
let strDate = formatter.string(from: Date())
print(strDate)

如果你想为NSTimeZone 对象设置defaultTimeZone,那么在Swift 3 中你可以这样设置。

NSTimeZone.default = TimeZone(abbreviation: "BST")!

【讨论】:

  • @AmrataB 通过设置此NSTimeZone.default = TimeZone(abbreviation: "BST")!,您只能设置不使用它的默认时区,并且当您使用 dateFormatter 设置特定时区时,它可能会用于您的系统或本地系统。
  • @AmrataB 你明白我想说的吗?
  • 您不必为 DateFormatter 单独指定 TimeZone。它会选择您在 NSTimeZone 默认值或 TimeZone 默认值上设置的那个。我的问题是,在 swift 3 之前,它曾经考虑过夏令时,即如果您打印时区,它曾经给这个欧洲/伦敦 (GMT+1) 偏移量 3600(日光),所以一切都对我有用。但现在,它已经开始返回欧洲/伦敦,或者只是一小时减去 UTC。这打破了一切。所以,我现在将默认设置为 UTC,这样它就不会在一个月后再次中断。
  • @AmrataB 我不确定你说的是否正确,因为我首先尝试使用 BST 在操场上设置默认时区,然后尝试获取当前时间,它不是 BST是我当前的时区,在使用 dateFormatter 设置时区后,我将能够获得当前的 BST 时间,可能是你再次错过了正确的理解检查。
  • @AmrataB 我在IBM Swift Sandbox 上发布了相同的代码,请检查此链接一次并尝试先运行代码,然后取消注释为 dateFormatter 指定时区的行,你会知道区别,检查此链接swiftlang.ng.bluemix.net/#/repl/57f885c0ed27cb2723a1cb52 首先,您将获得该 IBM 沙盒服务器当前时间的时间,如果您取消注释,您将获得当前 BST 时间。
【解决方案2】:
let locale = NSTimeZone.init(abbreviation: "BST")
NSTimeZone.default = locale as! TimeZone

试试这个

【讨论】:

  • 无需创建NSTimeZone 的实例,然后将其转换为TImeZone,而是可以像我的回答一样直接使用TimeZone(abbreviation:) 创建对象。
  • 我知道但是有点容易理解
【解决方案3】:

如果你使用的是日历,那么

// * 创建日历对象 *

var calendar = NSCalendar.current

// * 定义要使用的日历组件 时区到 UTC *

let unitFlags = Set<Calendar.Component>([.hour, .year, .minute])
calendar.timeZone = TimeZone(identifier: "UTC")!
/// Returns a time zone initialized with a given identifier.
///
/// An example identifier is "America/Los_Angeles".
///
/// If `identifier` is an unknown identifier, then returns `nil`.
public init?(identifier: String)

标识时区的地缘政治区域标识符。

公共变量标识符:字符串 { 获取 }

注意:如果你想设置日期格式化器时区,你可以像这样按照上面的方法:

dateFormatter.timeZone = TimeZone(identifier: "UTC")!

【讨论】:

    猜你喜欢
    • 2011-09-19
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多