【问题标题】:NSDate being set to the day before [duplicate]NSDate 设置为前一天[重复]
【发布时间】:2015-11-01 14:51:00
【问题描述】:

重要更新:如果您将鼠标悬停在 NSDATE 上,调试器会将 NSDate 转换为您在 Mac 上设置的本地时区,但如果您执行 NSLOG,您会注意到 NSDate 正在使用您设置的时区分配给其各自的格式化程序。

如果您想在 xcode 调试器中查看您正在使用的时区的 NSDate 是什么,请转到您的 Mac OS 的日期/时间设置并将时区更改为您正在测试的那个。

我要求从我传入的日期开始创建一个 NSDate,但目前它设置为我传入的前一天:

 NSString *dateStr = @"2015-08-09";

NSDateFormatter *myformatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd"];
NSDate *date = [formatter dateFromString:dateStr];

上面的代码返回:一个 NSDate 设置为 '2015-08-08 12:00:00 +0000'

我需要一个 NSDate 对象设置为我传入的 datStr。

【问题讨论】:

  • 你在哪个时区?
  • 如果您要投反对票,请留下原因,我会修复或删除问题。
  • @Fogmeister 无论时区如何都可以获得 NSDate 吗?
  • NSDate 对时区一无所知。这就是我问的原因。 NSDate 只是一个时间点。当您要求它使用NSLog 打印日期时,是您的计算机将该时间点转换为年、月、日、小时、分钟等。

标签: objective-c cocoa


【解决方案1】:

这或许,来自于:

Convert NSDate to NSString with NSDateFormatter with TimeZone without GMT Time Modifier

为命名时区保留小写的“z”,即 PST,为 -0800 保留大写的“Z”

NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"MMMM dd, yyyy (EEEE) HH:mm:ss z Z"];
NSDate *now = [NSDate date];
NSString *nsstr = [format stringFromDate:now];

此外,您的日期应该更可靠,例如,如果您想在您正在过去的当天过去,并且它是一天的休息日,那么只需添加一天。问题,似乎是日期返回正确的日期,即最后一天的结束,增加 1 秒或毫秒,它可能会被纠正,或者只是攻击这个并在你的天数上增加 1 天正在通过。要聪明!有时您只需要增加 1 天的时间来解决问题并继续前进。

【讨论】:

  • 如果该问题由另一个问题的答案来回答,则它是重复的,应该这样标记。
  • 当然可以,但我不知道这个堆栈是如何工作的,我已经在这里待了 2 天,我已经回答了大约十亿个你们无法回答的问题,所以请放心将其标记为重复的 IDGAF。另外,这显然是一个不同的问题,你读过这个问题吗?如果你没有,我建议你阅读它,它不是很多行,应该很容易消化。
  • @daddywarbucks 增加一天的想法似乎是一种黑客解决方案,我试图避免这种情况,但确实奏效了。
  • @ConfusedDeer,我知道,我知道,但这就是代码有时的工作方式,我讨厌自己做这样的事情,我明白了,但有时,这不值得麻烦,也许你几个小时后会有一些灵感,然后想“啊哈!,我想通了”
  • 您答案中的格式字符串与 OP 的字符串不匹配;还有一个比“黑客攻击”更好的方法来解决这个问题,所以它“可能会被纠正”。请参阅我提供的副本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 2011-02-06
相关资源
最近更新 更多