当我尝试更改格式时,为什么日期会发生变化?

时间:2013-03-18 12:55:53

标签: iphone ios

这是我用来更改日期格式的代码

      NSLog(@"newBirthDates%@",_newwBirthDates);
    NSDateFormatter *Form = [[NSDateFormatter alloc] init];
    [Form setDateFormat:@"MM/dd"];
    NSDate *date1 =[NSDate date];
    NSString *string =[Form stringFromDate:date1];
     NSLog(@"string%@",string);
    NSDate *todaydate =[Form dateFromString:string];
     NSLog(@"todaydate%@",todaydate);

这就是我得到的输出

     newBirthDates(
    "05/22",
    "07/11",
    "10/07",
    "02/20"
)
 newBirthDates(
    "05/22",
    "07/11",
    "10/07",
    "02/20"
)
 string03/18
 todaydate1970-03-17 18:30:00 +0000

现在我的问题是为什么3/18成为03/17?为什么有一天会减少

4 个答案:

答案 0 :(得分:4)

答案很简单 - 时区。 仔细看看NSLog打印出来的内容 1970-03-17 18:30:00 +0000

默认情况下,NSDateFormatter设置为您当地的时区。这意味着,如果您的时区为+5:30,则为其提供日期“1970/18/3”会产生1970-03-18 00:00:00 +0530 。 但是,NSLog始终以GMT(零)时区打印日期,添加/减去时区差异(5小时30分钟)。

基本上,没有什么可以修复的,如果你想用它来检查NSLog值,你只需要了解NSDate的工作原理。

答案 1 :(得分:1)

您的日志按字符串值显示,消除了所有重要的时区差异。

NSDate的日志显示GMT的时间。

这两个值都是正确的。

  

NSDate的唯一原始方法,timeIntervalSinceReferenceDate,   为NSDate接口中的所有其他方法提供了基础。   此方法返回相对于绝对引用的时间值   日期 - 格林威治标准时间2001年1月1日的第一个瞬间。

您必须阅读NSDate Documentation

答案 2 :(得分:1)

获取正确的日期,您可以使用此日期,

 NSDateFormatter *Form = [[NSDateFormatter alloc] init];
    [Form setDateFormat:@"MM/dd"];
    [Form setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    NSDate *date1 =[NSDate date];
    NSString *string =[Form stringFromDate:date1];
    NSLog(@"string%@",string);
    NSDate *todaydate =[Form dateFromString:string];
    NSLog(@"todaydate%@",todaydate);

上面的代码会给出正确的日期。

答案 3 :(得分:1)

主要是 TimeZone [Form setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

这是正确的代码:

NSDateFormatter *Form = [[NSDateFormatter alloc] init];
[Form setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[Form setDateFormat:@"MM/dd"];
NSDate *date =[NSDate date];
NSString *string =[Form stringFromDate:date];
NSDate *todaydate = [Form dateFromString:string];
NSLog(@"todaydate %@",todaydate);