【问题标题】:issue while constructing NSDate [duplicate]构建NSDate时出现问题[重复]
【发布时间】:2016-01-29 18:03:19
【问题描述】:

我正在用这个字符串制作NSDate,但每次我从Selected Month得到Previous Month

我找不到错误:

  NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];

  [dateFormatter setTimeZone:[NSTimeZone defaultTimeZone]];

  [dateFormatter setDateFormat:@"dd/MMM/yyyy"];

  NSDate *date = [dateFormatter dateFromString:strDate];

  NSLog(@"------Date----%@",date);

我已经尝试过很多Datestrings,其中一些是使用日志:

  strDate =---- 01/Jan/2016
  ------Date----2015-12-31 18:30:00 +0000

  strDate =----01/Dec/2015
  ------Date----2015-11-30 18:30:00 +0000

【问题讨论】:

  • 您设备的时区是什么。让我猜猜:印度
  • 是的@vikingosegundo 你是对的..但我使用了默认时区。还不够吗?
  • 当您创建日期时,会考虑您的默认时区。直接打印日期时,使用 UTC 时区 -> 时差为 5:30。
  • 那么我该如何解决这个问题?
  • 没有什么要解决的。只需使用 nsdateformatter 来打印它。下次再搜索:这种问题被回答了无数次。

标签: ios objective-c ios8 nsdate nsdateformatter


【解决方案1】:

正如 viking 所说,您所看到的是您显示结果日期的方式的产物。当你在 NSLog 中记录一个 NSDate 对象时,它总是以 UTC 显示。如果您的日期没有时间部分,则假定为午夜。如果您的时区在 UTC 之后,您所在时区的午夜将显示为前一天。

我建议您创建一个显示日期格式化程序来显示您的结果日期,并使用它:

- (NSString *) displayStringForDate: (NSDate *) date
{
   static NSDateFormatter *dateFormatter;
   if (dateFormatter == nil)
   {
     //This date formatter will default to the current time zone, like you want.
     dateFormatter = [[NSDateFormatter alloc]init];
     //Adjust the date format as desired
   {
   return [dateFormatter stringFromDate: date];
}

然后在您的测试代码中使用该方法:

NSLog(@"------Date----%@", [self displayStringForDate: date]);

【讨论】:

  • 我会将其编码为 NSDate 上的类别方法
  • 同意,这将是一个好方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多