NSDateFormatter返回错误的日期+ Swift

时间:2015-04-02 07:43:40

标签: swift nsdate nsdateformatter string-to-datetime

代码:

let dateString = "2016-04-02"
    var formatter: NSDateFormatter = NSDateFormatter()
    formatter.timeZone = NSTimeZone(abbreviation: "GMT +3:00")
    formatter.dateFormat = "yyyy-MM-dd"
    println("dateString: \(dateString)")
    formatter.locale =  NSLocale(localeIdentifier: "en_US_POSIX")
    let date = formatter.dateFromString(dateString)
    println("date: \(date)")

    formatter.dateFormat = "yyyy-MM-dd"
    let formattedDateString = formatter.stringFromDate(date!)
    println("formattedDateString: \(formattedDateString)")

输出

dateString: 2016-04-02
date: Optional(2016-04-01 21:00:00 +0000)
formattedDateString: 2016-04-02
2016-04-01 21:00:00 +0000

我正在尝试将字符串转换为NSDate数据类型但未获取正确的值。我尝试了很多解决方案,但它没有返回正确的值。我需要它以yyyy-MM-dd格式(2016-04-02)与我的输入相同" 2016-04-02"。如果有人可以提供帮助,那将是真正的帮助。提前致谢

4 个答案:

答案 0 :(得分:14)

我有同样的问题,这对我有用

您需要设置时区

formatter.timeZone = NSTimeZone(abbreviation: "GMT+0:00")

答案 1 :(得分:5)

当您从字符串转换为NSDate时,如果您没有将时区设置为格式化程序,您将获得本地时区中日期的NSDate。我想你的时区是GMT + 3.

然后,当您显示' date'的值时(使用println,NSLog但不使用NSDateFormatter),如果不设置时区,您将获得GMT + 0时间。这就是你3小时后的原因。

根据如何使用NSDateFormatter,您将拥有所需的日期字符串。在你的情况下,它返回你想要的东西,不是吗?

请记住,NSDate提供了一个时刻。

let dateString = "2016-04-02"
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
println("dateString: \(dateString)")

formatter.locale =  NSLocale(localeIdentifier: "en_US_POSIX")
let date = formatter.dateFromString(dateString) //without specify timezone, your dateString "2016-04-02" is your local time (GMT-3),  
//means it's 2016-04-02 00:00:000 at GMT+0. That is the value that NSDate holds.

println("date: \(date)") //that why it show 2016-04-01 21:00:000, but not 2016-04-02 00:00:000

formatter.dateFormat = "yyyy-MM-dd"
let formattedDateString = formatter.stringFromDate(date!)
println("formattedDateString: \(formattedDateString)")

答案 2 :(得分:5)

你的约会非常好。 :-)没有双关语。

我将详细介绍@HoaParis的答案。

首先,NSDate代表了一个时刻。它不是给定地点的日期时间值。因此,代表格林威治午夜的NSDate将于早上5:30在印度举行。

现在回答你的问题。当你给出一个没有时间的日期格式时,格式化程序会认为它是半夜。此外,如果没有提到时区,它将采用当前时区。

所以'2016-04-02'代表您所在时区的'2016-04-02,00:00:00'。您的时区是格林威治标准时间+3,这意味着当您在您的地方午夜时,它仍然是前一天在格林威治即英国的21:00:00。

正如我们所讨论的,NSDate是一个时刻,同一个NSDate对象代表了这两个看似不同的时代,但实际上它们是同一时刻。

当您默认打印日期时,它将打印相对于GMT而不是您的时区的日期,即2016-04-01,21:00:00。格式化程序会考虑您的时区并将其设为'2016-04-02'

答案 3 :(得分:3)

using System.Management.Automation;
using System.Management.Automation.Runspaces;

// https://msdn.microsoft.com/en-us/library/dd878294(v=vs.85).aspx
[Cmdlet("Reload", "Profile")]
public class ReloadProfileCmdlet : PSCmdlet {
    protected override void EndProcessing()
    {
        // https://msdn.microsoft.com/en-us/library/ms568378(v=vs.85).aspx
        // Runs $profile without parameters in the current context and displays the output and error
        InvokeCommand.InvokeScript(". $profile", false, PipelineResultTypes.Output | PipelineResultTypes.Error, null);
    }
}