当前位置: 首页 > 面试题库 >

NSDate()或Date()显示错误的时间

章誉
2023-03-14
问题内容

当我尝试记录当前日期时:

print(NSDate())

要么

print(Date())

(在Swift 3中)

或任何日期对象,它显示错误的时间。例如,现在大约是16:12,但上面显示的是

2016-10-08 20:11:40 +0000

我的日期在错误的时区吗?如何确定我的日期具有正确的时区?

为什么会这样,我该如何解决?如何在打印语句或调试器中轻松地在本地时区显示任意日期?

(请注意,这个问题是一个“铃声”,因此我可以提供一个简单的Swift 3 / Swift 2 Date /
NSDate扩展名,使您可以轻松地显示本地时区中的任何日期对象。


问题答案:

NSDate(或Swift≥V3中的Date)没有时区。它记录了世界各地的即时时间。

在内部,日期对象在格林威治标准时间(又称为UTC)中记录自“纪元日期”(即2001年1月1日午夜)以来的秒数。

我们通常会想到本地时区中的日期。

如果您使用

print(NSDate())

系统显示当前日期,但以UTC /格林威治标准时间表示。因此,唯一看起来正确的地方就是那个时区。

如果发出debugger命令,则在调试器中也会出现相同的问题

e NSDate()

真痛苦 我个人希望iOS / Mac OS使用用户的当前时区显示日期,但不显示。

编辑2:

我以前使用本地化字符串的一项改进(使它更易于使用)是创建Date该类的扩展:

extension Date {
    func localString(dateStyle: DateFormatter.Style = .medium, timeStyle: DateFormatter.Style = .medium) -> String {
        return DateFormatter.localizedString(from: self, dateStyle: dateStyle, timeStyle: timeStyle)
    }
}

这样一来,您可以只使用类似的表达式Date().localString(),或者如果您只想打印时间,则可以使用Date().localString(dateStyle:.none)

编辑:

我刚刚发现NSDateFormatterDateFormatter在Swift
3中)有一个类方法localizedString。这就是我下面的扩展所做的,但是更加简单明了。这是声明

class func localizedString(from date: Date, dateStyle dstyle: DateFormatter.Style, timeStyle tstyle: DateFormatter.Style) -> String

所以你只需使用

let now = Date()
print (DateFormatter.localizedString(
  from: now, 
  dateStyle: .short, 
  timeStyle: .short))

您几乎可以忽略下面的所有内容。

我创建了一个NSDate类的类别(swift 3中的Date),该类别具有一个localDateString方法,该方法在用户的本地时区显示日期。

这是Swift 3形式的类别:(文件名Date_displayString.swift)

extension Date {
  @nonobjc static var localFormatter: DateFormatter = {
    let dateStringFormatter = DateFormatter()
    dateStringFormatter.dateStyle = .medium
    dateStringFormatter.timeStyle = .medium
    return dateStringFormatter
  }()

  func localDateString() -> String
  {
    return Date.localFormatter.string(from: self)
  }
}

并以Swift 2形式:

extension NSDate {
   @nonobjc static var localFormatter: NSDateFormatter = {
    let dateStringFormatter = NSDateFormatter()
    dateStringFormatter.dateStyle = .MediumStyle
    dateStringFormatter.timeStyle = .MediumStyle
    return dateStringFormatter
  }()

public func localDateString() -> String
  {
    return NSDate.localFormatter.stringFromDate(self)
  }
}

(如果您希望使用其他日期格式,则可以很容易地修改日期格式化程序使用的格式。在所需的任何时区中显示日期和时间也很简单。)

我建议您在所有项目中都放置此文件的相应Swift 2 / Swift 3版本。

然后,您可以使用

斯威夫特2:

print(NSDate().localDateString())

斯威夫特3:

print(Date().localDateString())


 类似资料:
  • 问题内容: 我正在尝试使用获取Swift中的当前日期。创建断点并停止应用程序时,我发现设备的系统时间相差3个小时。应用程序正在真实的iPhone上运行。如何解决这个问题? 我还确保在App Delegate中编写以下内容: 但这仍然行不通。 问题答案: 它不会返回错误的时间。它返回正确的时间。NSDate没有任何时区信息。现在,当我们调用NSDate()时,我的计算机和您的计算机将报告完全相同的时

  • 第二个选项(来自Java SimpleDateFormat(“yyyy-mm-dd't'hh:mm:ss'z'”)将时区作为IST提供) 在这两种情况下,时间都错了。我的笔记本电脑或手机显示的不是当地时间,但输出时间是提前2小时。我怎么才能改变呢?我想有柏林(CEST)的当前时间也显示在我的电脑上。我感谢每一个评论。

  • 我正在使用转换到新时区UTC+3,这等于EAT时区,但Postgres(9.1)显示错误的时间 (默认时区为斯德哥尔摩) 如果将JodaTime与两个时区一起使用,则显示相同的正确结果“2015-01-13 10:40:00”。

  • 问题内容: 我要在当前时间之前的某个时间创建一个新的日期对象。如果我要在今天前1天放映,效果很好。但如果我想在30天前放映,那将是未来(?) 输出: 这里有什么限制?达到长期限制? 问题答案: 文字中的整数溢出, 在您的情况下,以前对文字进行求值,结果为负,然后分配给 这导致 转换成 注意:将其文字化,然后相乘 更好地使用类进行操作

  • 问题内容: 我正在运行MySql Server 5.7.11,这句话: 是 不是 工作。给出错误: 但是以下内容: 正常工作 。 DATE的情况相同。 作为 附带说明 ,它在MySQL文档中有所提及: DATE类型用于具有日期部分但没有时间部分的值。MySQL检索并以’YYYY-MM-DD’格式显示DATE值。支持的范围是“ 1000-01-01”至“ 9999-12-31”。 即使他们也说: 无

  • 问题内容: 调用显示编译时错误,并显示以下消息: getSupportFragmentManager()。getFragments()只能在同一库组中调用(groupId = com.android.support) 我在中导入了以下类: 延伸。 我的项目模块级别文件如下: 这是inside 方法的源代码。 我最近将Android Studio更新到了最新的稳定版本(2.3),并且还更新了Andr