NSDate设置swift中的时区

NSDate设置swift中的时区,swift,nsdate,Swift,Nsdate,如何从字符串返回预定义时区中的NSDate let responseString = "2015-8-17 GMT+05:30" var dFormatter = NSDateFormatter() dFormatter.dateFormat = "yyyy-M-dd ZZZZ" var serverTime = dFormatter.dateFromString(responseString) println("NSDate : \(serverTime!)") 上面的代码将时间返回为 20

如何从字符串返回预定义时区中的NSDate

let responseString = "2015-8-17 GMT+05:30"
var dFormatter = NSDateFormatter()
dFormatter.dateFormat = "yyyy-M-dd ZZZZ"
var serverTime = dFormatter.dateFromString(responseString)
println("NSDate : \(serverTime!)")
上面的代码将时间返回为

2015-08-16 18:30:00 +0000

日期格式必须指定给日期格式化程序的dateFormat属性

let date = NSDate.date()
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let str = dateFormatter.stringFromDate(date)
println(str)
这将使用设备上的默认时区打印日期。仅当您希望根据不同的时区输出时,您才会添加例如

斯威夫特3*

dateFormatter.timeZone = NSTimeZone(name: "UTC")
斯威夫特4*

dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
另请参阅链接

如何返回预定义时区中的NSDate

你不能

NSDate
的实例不包含任何关于时区或日历的信息。它只是简单地确定了宇宙时间中的一个点

您可以在任意日历中解释此
NSDate
对象。Swift的字符串插值(示例代码的最后一行)使用使用UTC的
NSDateFormatter
(即输出中的“+0000”)

如果您想在当前用户的日历中将
NSDate
的值作为字符串,则必须为此明确设置日期格式化程序。

Swift 4.0

dateFormatter.timeZone = TimeZone(abbreviation: "UTC")

无论使用何种语言,数字1都表示1。然而在英语中它的拼写是“一”,在西班牙语中它的拼写是“乌纳”,在阿拉伯语中它的拼写是“瓦希德”,等等

同样地,1970年的123982373秒将以不同的时区或日历格式反映出来,但仍然是1970年的123982373秒


3秒和7秒之间的差值是4秒。这不需要日历。您也不需要日历/时区来了解这两个158542200和1584729000之间的时间差

日期仅为1970年1月1日(UTC/GMT午夜)的时间间隔。日期也碰巧有字符串表示形式

重复Nikolia的回答,Swift的默认字符串插值(
2015-08-16 18:30:00+0000
)使用使用UTC的日期格式化程序(即输出中的“+0000”)

使用时区的日历为我们提供了一种上下文表示,它比计算两个巨大数字之间的差值更容易理解

意味着一个日期(想想1970年以来的一个时间间隔)每个日历将有不同的字符串解释。除此之外,日历本身也会因时区而异

我强烈建议您仔细研究一下,看看选择不同的时区将如何改变相同时刻/日期/时间间隔的字符串表示形式


我也建议去看看。主要包括这一部分:

时区只是时间戳字符串的修正,日期格式化程序不考虑它

考虑时区,必须设置格式化程序

的时区
dateFormatter.timeZone=时区(secondsFromGMT:-14400)


如果输入字符串始终具有相同的时区,则可以创建两个日期格式化程序以输出本地时区(或指定的时区):


为什么返回的日期与字符串不同。我是否可以将字符串作为NSDate返回,而不使用任何alterations@MugunthanBalakrishnan正如我试图解释的那样:
日期
不包含关于时区的信息。因此,返回的日期与您提供的字符串没有区别,只是以UTC表示。当您使用时区设置为“GMT+05:30”的日期格式化程序时,它将返回与您用于输入的字符串值完全相同的字符串值。
let timeFormatterGet = DateFormatter()
timeFormatterGet.dateFormat = "h:mm a"
timeFormatterGet.timeZone = TimeZone(abbreviation: "PST")

let timeFormatterPrint = DateFormatter()
timeFormatterPrint.dateFormat = "h:mm a"
// timeFormatterPrint.timeZone = TimeZone(abbreviation: "EST") // if you want to specify timezone for output, otherwise leave this line blank and it will default to devices timezone

if let date = timeFormatterGet.date(from: "3:30 PM") {
    print(timeFormatterPrint.string(from: date)). // "6:30 PM" if device in EST
} else {
   print("There was an error decoding the string")
}