gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 05:04:47 24 4
gpt4 key购买 nike

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

NSDate *currentDate = [NSDate date];

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

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

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

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

最佳答案

NSDates 总是以 UTC 格式存储,实际上日期本身并不知道时区或周、月、年的任何信息。它们只是一个时间点。

要查看您在地球表面的位置的正确时间,您需要考虑代表您的时间模型的 NSCalendar。您可以直接使用它并弄乱您的日期,或者创建一个 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/11454387/

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