【问题标题】:Converting string to NSDate [duplicate]将字符串转换为 NSDate [重复]
【发布时间】:2013-08-19 18:48:50
【问题描述】:

我正在尝试使用 NSDateFormatter 将以下字符串转换为 NSDate:2013-08-19 7:00 AM

但是,会创建以下 NSDate:2013-08-19 04:00:00 +0000。时间不对。

我的代码如下。我不知道我做错了什么。

NSDateFormatter *dateFormatter = [NSDateFormatter new];
[dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm a"];
NSString *string = @"2013-08-19 7:00 AM";
NSDate *dateFromString = [dateFormatter dateFromString:string];

【问题讨论】:

  • 也许问题在于您没有指定时区。你在哪个时区?
  • @LuisCien 我没有意识到这很重要。我想创建两个日期对象(例如上午 7 点和上午 11 点)并计算两次之间的秒数。
  • 我之前也遇到过这个“问题”。不是真正的问题,但您没有设置时区。 NSDate 不包括时区。
  • 是的。如果那是您获得时间的地方。时间从哪里来。
  • @JackHumphries 如果您想要本地时区,则无需设置格式化程序的时区 - 这是默认行为。

标签: objective-c cocoa-touch nsdate


【解决方案1】:

您正在尝试使用 24 小时格式来表示小时 AM/PM 指示符,但这是行不通的。换行:

[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm a"];

到这里:

[dateFormatter setDateFormat:@"yyyy-MM-dd hh:mm a"];

你会发现你的代码现在可以工作了。

【讨论】:

    【解决方案2】:

    您看到“+0000”的原因意味着操作系统正在将您的时间字符串转换为 UTC。要解决这个问题,您只需设置当地时区。

    dateFormatter.timeZone = YOUR_LOCAL_TIMEZONE;
    

    此外,要在本地设置中打印您的日期,您可以使用NSDateFormatter's:

    localizedStringFromDate:dateStyle:timeStyle:
    

    希望这会有所帮助!

    【讨论】:

    • 正确的是:[dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];
    • 凌晨 4 点还在返回。
    • @JackHumphries 请查看我的更新答案。干杯!
    • @LuisCien 不,操作系统没有转换任何字符串。问题很简单——当你记录一个NSDate 对象时,description 方法在NSDate 上被调用。此方法的实现是将日期作为 UTC 时间的字符串返回。这些都与使用NSDateFormatter 将字符串实际解析为NSDate 无关(默认情况下假定语言环境时间)。
    • 他看到+0000的原因是NSDate的NSLog总是返回UTC。
    猜你喜欢
    • 2011-01-19
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 2012-11-27
    相关资源
    最近更新 更多