iOS:从 NSDate 获取本地化小时
Posted
技术标签:
【中文标题】iOS:从 NSDate 获取本地化小时【英文标题】:iOS: Get localised hour from NSDate 【发布时间】:2015-06-03 09:33:43 【问题描述】:如何仅从 NSDate 获取本地化时间,对应于 12 小时/24 小时时间由用户在设备上设置? 考虑日期是“2015 年 6 月 3 日下午 3:00” 如果设置了 12 小时格式,则应显示下午 3 点(不包括分钟部分) 如果设置了 24 小时格式,则应显示 15(不包括分钟部分)
我已尝试在所有语言环境中进行以下操作,但均未成功。例如,它非常适合 de_DE 和 fr_FR,但对于 en_US,它总是返回 3 而没有 AM/PM。
NSDateFormatter *dateFormatter = [NSDateFormatter new];
NSString *localeFormatString = [NSDateFormatter dateFormatFromTemplate:@"HH" options:0 locale:dateFormatter.locale];
dateFormatter.dateFormat = localeFormatString;
dateFormatter.timeZone = [NSTimeZone defaultTimeZone];
NSString * hour = [dateFormatter stringFromDate:date];
NSLog(@"%@",hour);
附: 如果我使用以下代码获取时间字符串(小时和分钟),则它在语言环境和 12/24 小时时间格式方面都能完美运行。但是,我只想获得几个小时,而 12/24 小时时间格式无法实现这一点。
NSDateFormatter *timeFormatter = [[NSDateFormatter alloc] init];
timeFormatter.timeStyle = NSDateFormatterShortStyle;
timeFormatter.dateFormat = NSDateFormatterNoStyle;
timeFormatter.AMSymbol = @"a";
timeFormatter.PMSymbol = @"p";
timeFormatter.timeZone = timeZone;
return [timeFormatter stringFromDate:date];
【问题讨论】:
【参考方案1】:这有点小技巧,但可以通过以下方式获得本地化的小时字符串,例如“5 PM”或“17”(取决于用户的区域设置):
-
构造一个
NSDate
并使用所需的小时,并将分钟设置为 0;
使用NSDateFormatter
获取该日期的本地化字符串表示,使用日期样式NSDateFormatterNoStyle
和时间样式NSDateFormatterShortStyle
;
从字符串中手动删除:00
(如果需要)。
代码:
// Construct an NSDate whose hour is set to the specified hour, with minutes and seconds 0.
// (The date of the object is irrelevant, we won't use it.)
NSDateComponents *components = [[NSDateComponents alloc] init];
[components setHour:hour];
[components setMinute:0];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *topOfHour = [calendar dateFromComponents:components];
// Get a localized string representation of the time, e.g. "5:00 PM" or "17:00"
NSDateFormatter *timeFormatter = [[NSDateFormatter alloc] init];
timeFormatter.timeStyle = NSDateFormatterShortStyle;
timeFormatter.dateStyle = NSDateFormatterNoStyle;
NSString *hourString = [timeFormatter stringFromDate:topOfHour];
// Remove the ":00" from the string.
hourString = [hourString stringByReplacingOccurrencesOfString:@":00" withString:@""];
如果您只想从包含 AM/PM 指示符的时间字符串中删除“:00”部分,以得到(例如)“5 PM”或“17:00”等字符串,您可以将其包装起来条件中的最后一行,例如:
if ([hourString containsString:timeFormatter.AMSymbol] || [hourString containsString:timeFormatter.PMSymbol])
hourString = [hourString stringByReplacingOccurrencesOfString:@":00" withString:@""];
由于此实现依赖于硬编码的“:00”,它可能不适用于某些语言环境,例如不使用 :
作为小时-分钟分隔符的语言环境,或者不计算从 0 开始的分钟数的语言环境,或者还包括 NSDateFormatterShortStyle
中的秒数的语言环境。
【讨论】:
【参考方案2】:您将使用带有 dd-MM-yyyy 的 NSDateFormatter,然后使用应用于格式化程序的 NSTimeZone 来调整本地时区。
NSDate *date = [[NSDate alloc] init];
NSLog(@"%@", date);
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd-MM-yyyy hh:mm a"];
NSString *strDateString = [dateFormatter stringFromDate:date];
NSLog(@"%@", strDateString);
NSTimeZone *timeZone = [NSTimeZone localTimeZone];
[dateFormatter setTimeZone:timeZone];
NSLog(@"adjusted for timezone: %@", [dateFormatter stringFromDate:date]);
【讨论】:
谢谢。但是我不需要整个日期字符串只有几个小时,将尝试使用格式为“hh a”的代码。 这不是特定的 12/24 小时格式,它总是返回带有 AM/PM 的小时数。但是,如果时间格式为 24 小时,则不应返回 AM/PM。 使用下面的代码来转换 am/pm dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];以上是关于iOS:从 NSDate 获取本地化小时的主要内容,如果未能解决你的问题,请参考以下文章