NSDateComponents 错误地增加了一个小时
NSDateComponents wrongly adds one extra hour
我正在尝试在 Objective-C 中创建一个方法,该方法可以从以 "HHmm" 格式编写的时间值中获取总分钟数。
例如对于“0210”,return 值应为 130。
+ (int)totalMinutesFromHHmm:(NSString *)HHmm {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
[dateFormatter setTimeZone:timeZone];
[dateFormatter setDateFormat:@"HHmm"];
NSLocale *enLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en-GB"];
[dateFormatter setLocale:enLocale];
NSDate *date = [dateFormatter dateFromString:HHmm];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *components = [calendar components:( NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond) fromDate:date];
NSInteger hour = [components hour];
NSInteger minute = [components minute];
return (int)(hour * 60 + minute);
}
问题出在小时部分:它总是休息一小时。
在这张图片上,NSDate 显示了一个 09:22 时间,但在下图中,您可以看到小时部分是 10(分钟部分正确设置为 22)。
我查看了其他帖子('NSDateComponents on hour off' 等),但找不到有效的解决方案。知道我做错了什么吗?
可能不需要时区/区域设置。我可能是误会了,但您似乎只是想获取 HHmm 格式的字符串并计算总分钟数。
如果您出于某种原因仍需要使用 NSDate,这可能有效:
+ (int)totalMinutesFromHHmm:(NSString*)HHmm
{
NSString* refHHmm = @"0000";
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"HHmm"];
NSDate* refDate = [dateFormatter dateFromString:refHHmm];
NSDate* date = [dateFormatter dateFromString:HHmm];
int minutes = [date timeIntervalSinceDate:refDate] / 60;
return minutes;
}
否则,这可能是一个更简单的选项,因为您知道您将有一个代表小时和分钟的 4 个字符的字符串:
+ (int)totalMinutesFromHHmm:(NSString*)HHmm
{
int minutes = [[HHmm substringWithRange:NSMakeRange(0, 2)] intValue] * 60;
minutes += [[HHmm substringWithRange:NSMakeRange(2, 2)] intValue];
return minutes;
}
我正在尝试在 Objective-C 中创建一个方法,该方法可以从以 "HHmm" 格式编写的时间值中获取总分钟数。
例如对于“0210”,return 值应为 130。
+ (int)totalMinutesFromHHmm:(NSString *)HHmm {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
[dateFormatter setTimeZone:timeZone];
[dateFormatter setDateFormat:@"HHmm"];
NSLocale *enLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en-GB"];
[dateFormatter setLocale:enLocale];
NSDate *date = [dateFormatter dateFromString:HHmm];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *components = [calendar components:( NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond) fromDate:date];
NSInteger hour = [components hour];
NSInteger minute = [components minute];
return (int)(hour * 60 + minute);
}
问题出在小时部分:它总是休息一小时。
在这张图片上,NSDate 显示了一个 09:22 时间,但在下图中,您可以看到小时部分是 10(分钟部分正确设置为 22)。
我查看了其他帖子('NSDateComponents on hour off' 等),但找不到有效的解决方案。知道我做错了什么吗?
可能不需要时区/区域设置。我可能是误会了,但您似乎只是想获取 HHmm 格式的字符串并计算总分钟数。
如果您出于某种原因仍需要使用 NSDate,这可能有效:
+ (int)totalMinutesFromHHmm:(NSString*)HHmm
{
NSString* refHHmm = @"0000";
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"HHmm"];
NSDate* refDate = [dateFormatter dateFromString:refHHmm];
NSDate* date = [dateFormatter dateFromString:HHmm];
int minutes = [date timeIntervalSinceDate:refDate] / 60;
return minutes;
}
否则,这可能是一个更简单的选项,因为您知道您将有一个代表小时和分钟的 4 个字符的字符串:
+ (int)totalMinutesFromHHmm:(NSString*)HHmm
{
int minutes = [[HHmm substringWithRange:NSMakeRange(0, 2)] intValue] * 60;
minutes += [[HHmm substringWithRange:NSMakeRange(2, 2)] intValue];
return minutes;
}