【问题标题】:date returned from dateFromString method从 dateFromString 方法返回的日期
【发布时间】:2013-08-20 11:42:36
【问题描述】:

请帮我解决问题。

(objValidation.aRange.MinimumValue、objValidation.aRange.MaximumValue 的值来自网络服务)

(我在 firstDate、secondDate 中的日期有误。)

NSDateFormatter *df  = [[NSDateFormatter alloc] init];
                [df setDateFormat:@"MM/dd/yyyy"];
                [df setTimeZone:[NSTimeZone localTimeZone]];
                NSDate *myDate = [df dateFromString:inputString];
                [df setDateFormat:@"MM/dd/yyyy"];
                NSLog(@"objValidation.aRange.MinimumValue : %@,objValidation.aRange.MaximumValue :%@, inputString : %@",objValidation.aRange.MinimumValue,objValidation.aRange.MaximumValue,inputString);
                NSDate *firstDate = [df dateFromString:objValidation.aRange.MinimumValue];
                NSDate *secondDate = [df dateFromString:objValidation.aRange.MaximumValue];
                NSLog(@"myDate : %@,firstDate :%@, secondDate : %@",myDate,firstDate,secondDate);
                [df release];

输出:

objValidation.aRange.MinimumValue : 8/20/2013
objValidation.aRange.MaximumValue :12/31/9999
inputString : 08/22/2013 
myDate : 2013-08-21 18:30:00 +0000
firstDate :2013-08-19 18:30:00 +0000
secondDate : 1999-12-30 18:30:00 +0000 

【问题讨论】:

  • 请记住,NSLog 转储 NSDate 值的时间为 UTC,而不是印度时间。
  • 看起来不错,考虑到 NSLog 的时区偏移量已经发布了大约 100 次。
  • @MarcusAdams 我尝试删除该行,但没有帮助。它适用于 iOS 5/5.1,但不适用于 iOS 6/6.1
  • 你认为他们的格式化程序有什么问题吗?

标签: ios objective-c ios6 nsdate ios6.1


【解决方案1】:

重新调整的日期是正确的,但您没有考虑时区。

所有NSDate 对象都没有时区。因此,当您解析日期时将使用系统时区。

【讨论】:

  • 但同样适用于 iOS 5/5.1 模拟器。它在 iOS 6/6.1 中失败。
  • @HotLicks 我不确定,为什么它在 iOS 5 中有效。 dateFromString 方法有问题吗?请告诉我。谢谢。
  • @Mahesh - 我怀疑你只是误解了结果。再一次,当您使用 NSLog 转储 NSDate 对象时,它会以 UTC 时间转储,而不是本地时间。在印度,这意味着午夜日期似乎比您预期的早 1 天。
  • @HotLicks 是的,我明白这一点。但是为什么输入到dateFromString方法(objValidation.aRange.MaximumValue :12/31/9999)的secondDate(1999-12-30 18:30:00 +0000)给出1999,它应该是1天+或-,比如你说的。
  • 请记住,NSDate 的内部表示类似于 2001 年 1 月 1 日之前/之后的 8 字节值(以毫秒为单位)。可以表示的最大日期是有限的,可以计算为如果我做对了,大约在 6459 年。该代码正在尽最大努力理解一个明显虚假的日期。
【解决方案2】:

试试这个代码:

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"MM/dd/yyyy"];
NSDate *date = [df dateFromString:@"8/20/2013"];
NSTimeZone *currentTimeZone = [NSTimeZone localTimeZone];
NSTimeZone *utcTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];
NSInteger currentGMTOffset = [currentTimeZone secondsFromGMTForDate:date];
NSInteger gmtOffset = [utcTimeZone secondsFromGMTForDate:date];
NSTimeInterval gmtInterval = currentGMTOffset - gmtOffset;
NSDate *destinationDate = [[NSDate alloc] initWithTimeInterval:gmtInterval sinceDate:date];
NSLog(@"DateString : %@", destinationDate);

你会得到你想要的准确输出。

【讨论】:

  • 使用 NSDateFormatter 然后手动进行时区运算,而不是简单地设置所需时区的格式化程序,有点愚蠢(而且容易出错)。
猜你喜欢
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多