【问题标题】:NSDateComponents wrongly adds one extra hourNSDateComponents 错误地增加了一小时
【发布时间】:2019-05-13 02:07:40
【问题描述】:

我正在尝试在 Objective-C 中创建一个方法,该方法将从时间值中获取总分钟数,以“HHmm”格式编写。

例如对于“0210”,返回值应为 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 hours off”等),但找不到有效的解决方案。知道我做错了什么吗?

【问题讨论】:

  • 英国会做类似于夏令时的事情吗?如果是这样,在这种情况下,UTC 是否会比为英国语言环境计算的时间少一小时?
  • 请不要显示代码图片。显示代码本身。使用带有打印语句的实际示例来演示可重现的输入和输出。
  • 看来图片是用来说明数值的,如调试器所示。我不认为这是一件坏事。除图片外,还包含实际代码。

标签: ios objective-c parsing nsdate nsdatecomponents


【解决方案1】:

时区/语言环境可能不需要进入这个。我可能会误解,但您似乎只是想采用 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;
}

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多