0

我希望这与 GMT 无关,否则我会觉得很愚蠢。

2个快速相关的问题。为什么这会转换为不同的日期?正在失去一天。我查看了其他答案中所述的时区,但它始终是我所期望的 GMT 时区0000 。我认为错误在我的setDateFormat中,但我看不到如何修复它。

NSString *stringFromDate = self.dateLabel.currentTitle;
NSLog(@"StringFromDateWeight! %@", stringFromDate);

NSDateFormatter *df = [[NSDateFormatter alloc] init];
//Convert Back to NSDate
[df setDateFormat:@"ddMMyyyy"];

NSDate *inputedDate = [df dateFromString: stringFromDate];
NSLog(@"StringFromDateWeight2! %@", inputedDate);

NSLog(@"StringFromDateWeight! %@", stringFromDate);
17072013

NSLog(@"StringFromDateWeight2! %@", inputedDate); is  

2013-07-16 23:00:00 +0000

我还使用下面的代码来比较 2 个日期,我是否正确,它会在几秒钟内返回?我将如何将其更改为在几天内返回?

int intervall = (int) [theDate timeIntervalSinceDate: now];
4

1 回答 1

4

如果您没有明确设置时区NSDateFormatter,将使用您当地的时区。您没有设置一个,因此您的格式化程序将在您的时区中创建一个位于“7 月 17 日午夜”的 NSDate。NSDate 方法将description返回一个以 UTC 时区格式化的日期。既然你得到“7 月 16 日 23:00:00”,我猜你的时区是 UTC+1。

你有两个选择。通过明确设置时区以 UTC 计算。

df.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];

或者,通常更有用的是,不要查看descriptionNSDate 并[inputedDate descriptionWithLocale:[NSLocale currentLocale]]用于调试,它将打印为您的时区格式化的日期。
如果您想向用户显示日期,请使用另一个NSDateFormatter(最好使用 dateStyle 和 timeStyle 而不是 dateFormat,因为硬编码的 dateFormats 是邪恶的

只是显示不同,底层的 NSDate 对象还是一样的。


关于你的第二个问题:

在许多时区,每年有 2 天没有 24 小时,因此您无法用从timeIntervalSinceDate:.

您必须使用NSDateComponentsNSCalendar。幸运的是,已经有一种方法可以完全满足您的要求。components:fromDate:toDate:options:

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [calendar components:NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit fromDate:inputedDate toDate:[NSDate date] options:0];
NSLog(@"Date was %d days (and %d hours, %d minutes and %d seconds) ago", components.day, components.hour, components.minute, components.second);

如果您只需要天数,则可以删除所有组件,除了NSDayCalendarUnit

于 2013-07-17T21:13:40.923 回答