iOS:从NSDate获取本地化时间

时间:2015-06-03 09:33:43

标签: ios objective-c datetime localization nsdateformatter

如何仅在12小时/ 24小时时间内从NSDate获取本地化时间由用户在设备上设置? 考虑日期是" 2015年6月3日3:00 PM" 如果设置了12小时格式,则应显示3PM(不包括分钟部分) 如果设置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);

P.S。 如果我使用以下代码获得时间字符串(小时和分钟),它在区域设置以及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];

2 个答案:

答案 0 :(得分:0)

您将使用带有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]);

答案 1 :(得分:0)

这有点hack,但是可以通过以下方式获得本地化的小时字符串,例如“下午5点”或“ 17”(取决于用户的语言环境设置)。

  1. 使用所需的小时并将分钟设置为0来构造NSDate
  2. 使用NSDateFormatter使用日期样式NSDateFormatterNoStyle和时间样式NSDateFormatterShortStyle获得该日期的本地化字符串表示形式;
  3. 从字符串中手动删除: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中还包括秒数的语言环境。