gpt4 book ai didi

objective-c - NSDate 日期方法返回错误结果

转载 作者:行者123 更新时间:2023-11-30 13:44:16 26 4
gpt4 key购买 nike

我知道有很多此类问题,但我没有找到适合我的案例的解决方案;我需要获取当前且正确的 NSDate 对象,而不是 NSString!此代码返回错误的时间(+3 小时),因为我来自乌克兰。

NSDate *currentDate = [NSDate date];

如何从NSDateFormatter获取当前的NSDate对象?我只知道如何获取 NSString,但我不需要它。

编辑:我使用此代码使用 NSCalendar 对象比较 2 个 NSDates,这里是代码:

NSCalendar *calendar = [NSCalendar currentCalendar];
NSUInteger unitFlags = NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
NSDateComponents *components = [calendar components:unitFlags fromDate:nowDate toDate:endDate options:0];

components.hour 显示了 +3 小时的差异

最佳答案

NSDate 始终存储在 UTC 中,实际上日期本身不知道任何有关时区或周、月、年的信息。它们只是一个时间点。

要查看您在地球表面上的位置的正确时间,您需要考虑 NSCalendar,它代表您的时间模型。您可以直接使用它并修改您的日期,或者创建一个 NSDateFormatter ,该 NSDateFormatter 将保持日期不变,但根据您的需要调整其外观。

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterFullStyle];
[formatter setTimeStyle:NSDateFormatterFullStyle];

NSLog(@"%@", [formatter stringFromDate: date1]);

结果

Thursday, July 12, 2012, 4:36:07 PM Central European Summer Time 
<小时/>

回复评论:

尝试将此代码作为测试

NSDate *now = [NSDate date];
NSDate *startOfToday = nil;
NSDate *startOfThisWeek = nil;
NSDate *startOfThisMonth = nil;
NSDate *startOfThisYear = nil;
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&startOfToday interval:NULL forDate:now];
[[NSCalendar currentCalendar] rangeOfUnit:NSWeekCalendarUnit startDate:&startOfThisWeek interval:NULL forDate:now];
[[NSCalendar currentCalendar] rangeOfUnit:NSMonthCalendarUnit startDate:&startOfThisMonth interval:NULL forDate:now];
[[NSCalendar currentCalendar] rangeOfUnit:NSYearCalendarUnit startDate:&startOfThisYear interval:NULL forDate:now];

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterFullStyle];
[formatter setTimeStyle:NSDateFormatterFullStyle];

NSLog(@"%@", now);
NSLog(@"%@", [formatter stringFromDate:now]);

NSLog(@"%@", startOfToday);
NSLog(@"%@", [formatter stringFromDate:startOfToday]);

NSLog(@"%@", startOfThisWeek);
NSLog(@"%@", [formatter stringFromDate:startOfThisWeek]);

NSLog(@"%@", startOfThisMonth);
NSLog(@"%@", [formatter stringFromDate:startOfThisMonth]);

NSLog(@"%@", startOfThisYear);
NSLog(@"%@", [formatter stringFromDate:startOfThisYear]);

您将意识到,日、周、月和年的开始将调整为您的本地时间,因为每个 NSLog 对中的第一个将为您提供 UTC 日期,第二个为您本地时区.

<小时/>

在您发布此代码的聊天中

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setDateFormat:@"yyyy-MM-dd HH:mm"];
[dateFormat setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
NSDate *date = [dateFormat dateFromString:dateString];
[dateFormat release];

所以问题是,日期字符串实际上不是来自 GMT,而是 EET(东欧时间)

尝试

[dateFormat setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EET"]]; 

但迄今为止最优雅的解决方案是获取具有 UTC 偏移量的日期字符串,类似于 2012-07-12 12:23:00 +0300(如果可能的话)。
在这种情况下,您可以使用
解析它[dateFormat setDateFormat:@"yyyy-mm-dd HH:mm:ss Z"]; 并且不需要进一步的时区处理,因为格式化程序通过 Z-说明符知道偏移量。
另请注意,如果您未设置任何时区,则应使用设备的当前时区。如果用户始终与日期字符串中的时间位于同一时区,那么这也应该有效。但是,如果用户离开该区域,或者您想让它在全局范围内运行,您应该使用我为您提供的解决方案之一。将第二个(在日期字符串中指定时区)作为首选。

关于objective-c - NSDate 日期方法返回错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35164594/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com