如何用日期显示时区缩写

时间:2015-03-17 08:01:17

标签: ios objective-c timezone nsdateformatter nstimezone

我在UTC中得到一段时间,并希望附上时区缩写。我有以下代码来获取时区缩写,但它给出的格式为GMT +5.30。我想要IST。

对于美国来说,它是作为EDT提供的,我需要所有时区给出3个字母的缩写。

这可能吗?

请检查以下代码:

NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZ"];
NSDate* sourceDate = [dateFormatter dateFromString:@"2015-03-16T13:08:17.989Z"];
NSTimeZone* destinationTimeZone = [NSTimeZone defaultTimeZone];
NSString *str =[destinationTimeZone abbreviation];

NSDateFormatter* dateFormat = [[NSDateFormatter alloc] init];

[dateFormat setDateFormat:@"MMMM dd yyyy, HH:mm "];
NSString* localTime = [dateFormat stringFromDate:sourceDate];
NSString* str1 = [NSString stringWithFormat:@"%@, %@",localTime, str];
NSLog(@"localTime:%@", str1);

输出结果为:

localTime:March 16 2015, 18:38 , GMT+5:30

我需要它

localTime:March 16 2015, 18:38 , IST

请帮忙!

4 个答案:

答案 0 :(得分:2)

您可以将时区设置为您的日期,如:

[dateFormat setTimeZone:DesiredTimeZone];

然后使用日期格式化程序格式化它:

NSDateFormatter *formatter = [NSDateFormatter new];
formatter.dateFormat = @"dd MMM @ HH:mm z";

根据时区以03字母格式将代码放入z属性。

了解更多详情click here

答案 1 :(得分:0)

IST实际上是一个含糊不清的缩写。 有Israel Standard TimeIndian Standard TimeIrish Standard Time。所有这些都缩写为IST。

虽然某些缩写可用于创建有效的NSTimeZone对象(iOS基本上猜测您想要的时区),但NSTimeZone不会返回代表多个时区的缩写。

如果你坚持使用"IST",你可以自己创建。只需比较secondsFromGMT

NSTimeZone *timezone = [NSTimeZone timeZoneWithAbbreviation:@"IST"];
NSString *abbreviation = [timezone abbreviation];
if (![[NSTimeZone abbreviationDictionary] objectForKey:abbreviation]) {
    NSLog(@"\"%@\" is not a real abbreviation", abbreviation);
    if (timezone.secondsFromGMT == 19800) {
        abbreviation = @"IST";
    }
}
NSLog(@"Abbreviation: %@", abbreviation);

答案 2 :(得分:0)

每个时区都有一个名称​​ area / city (少数有三个部分),例如 Europe / London Asia / Kolkata < / em>的。所有这些可能有一个缩写,如果观察到夏令时有两个,并且具有相同GMT偏移的不同区域可能有不同的缩写(具有不同偏移的区域可能使用相同的缩写 - 缩写< em>不独特)。

您可以使用以下片段发现Cocoa所知道的区域:

for(NSString *zone in [NSTimeZone knownTimeZoneNames])
{
   NSTimeZone *tz = [NSTimeZone timeZoneWithName:zone];
   NSLog(@"%@: %@", zone, tz.abbreviation);
}

这将输出名称列表和当前缩写(如果已知)或GMT偏移(如果缩写未知)。缩写为 current ,因为它考虑了夏令时。

如果此代码显示以GMT +或GMT-开头的缩写,就像亚洲/加尔各答一样,您可以使用自己的表来查找缩写。例如。创建一个NSDictionary,它将时区名称映射到包含一个或两个缩写的数组或字典,用于标准和夏令时。您可以将此表存储为plist并将其加载到应用程序中。

鉴于任何NSDateNSTimeZone使用abbreviationForDate:来确定OS X是否知道缩写;如果它不使用nameisDaylightSavingsForDate:索引到您自己的表中。

有关区域和缩写的列表,只需Google。

如果您对C级交互感到满意,可以解码存储在/usr/local/zoneinfo中的文件,例如/usr/local/zoneinfo/Asia/Kolkata,即从目录后面跟着区域名称形成的路径。这些是二进制文件,格式在Unix手册页tzfile(5)中描述。 Kolkata的文件包含IST缩写(与都柏林的缩写一样)。

HTH

答案 3 :(得分:0)

当您使用此时区名称时,可以获得时区缩写。

+ (NSString *)getAbbriviationByTimeZone:(NSString *)timeZone {
    if ([timeZone isEqualToString:@"America/Halifax"])
        return @"ADT";
    if ([timeZone isEqualToString:@"America/Juneau"])
        return @"AKDT";
    if ([timeZone isEqualToString:@"America/Argentina/Buenos_Aires"])
        return @"ART";
    if ([timeZone isEqualToString:@"America/Halifax"])
        return @"AST";
    if ([timeZone isEqualToString:@"Asia/Dhaka"])
        return @"BDT";
    if ([timeZone isEqualToString:@"America/Sao_Paulo"])
        return @"BRST";
    if ([timeZone isEqualToString:@"America/Sao_Paulo"])
        return @"BRT";
    if ([timeZone isEqualToString:@"Europe/London"])
        return @"BST";
    if ([timeZone isEqualToString:@"Africa/Harare"])
        return @"CAT";
    if ([timeZone isEqualToString:@"America/Chicago"])
        return @"CDT";
    if ([timeZone isEqualToString:@"Europe/Paris"])
        return @"CEST";
    if ([timeZone isEqualToString:@"Europe/Paris"])
        return @"CET";
    if ([timeZone isEqualToString:@"America/Santiago"])
        return @"CLST";
    if ([timeZone isEqualToString:@"America/Santiago"])
        return @"CLT";
    if ([timeZone isEqualToString:@"America/Bogota"])
        return @"COT";
    if ([timeZone isEqualToString:@"America/Chicago"])
        return @"CST";
    if ([timeZone isEqualToString:@"Africa/Addis_Ababa"])
        return @"EAT";
    if ([timeZone isEqualToString:@"America/New_York"])
        return @"EDT";
    if ([timeZone isEqualToString:@"Europe/Istanbul"])
        return @"EEST";
    if ([timeZone isEqualToString:@"Europe/Istanbul"])
        return @"EET";
    if ([timeZone isEqualToString:@"America/New_York"])
        return @"EST";
    if ([timeZone isEqualToString:@"Asia/Dubai"])
        return @"GST";
    if ([timeZone isEqualToString:@"Asia/Hong_Kong"])
        return @"HKT";
    if ([timeZone isEqualToString:@"Pacific/Honolulu"])
        return @"HST";
    if ([timeZone isEqualToString:@"Asia/Bangkok"])
        return @"ICT";
    if ([timeZone isEqualToString:@"Asia/Tehran"])
        return @"IRST";
    if ([timeZone isEqualToString:@"Asia/Calcutta"])
        return @"IST";
    if ([timeZone isEqualToString:@"Asia/Tokyo"])
        return @"JST";
    if ([timeZone isEqualToString:@"Asia/Seoul"])
        return @"KST";
    if ([timeZone isEqualToString:@"Asia/Hong_Kong"])
        return @"HKT";
    if ([timeZone isEqualToString:@"Europe/Moscow"])
        return @"MSD";
    if ([timeZone isEqualToString:@"Europe/Moscow"])
        return @"MSK";
    if ([timeZone isEqualToString:@"America/Denver"])
        return @"MST";
    if ([timeZone isEqualToString:@"Pacific/Auckland"])
        return @"NZDT";
    if ([timeZone isEqualToString:@"Pacific/Auckland"])
        return @"NZST";
    if ([timeZone isEqualToString:@"America/Los_Angeles"])
        return @"PDT";
    if ([timeZone isEqualToString:@"America/Lima"])
        return @"PET";
    if ([timeZone isEqualToString:@"Asia/Manila"])
        return @"PHT";
    if ([timeZone isEqualToString:@"Asia/Karachi"])
        return @"PKT";
    if ([timeZone isEqualToString:@"America/Los_Angeles"])
        return @"PST";
    if ([timeZone isEqualToString:@"Asia/Singapore"])
        return @"SGT";
    if ([timeZone isEqualToString:@"Africa/Lagos"])
        return @"WAT";
    if ([timeZone isEqualToString:@"Europe/Lisbon"])
        return @"WEST";
    if ([timeZone isEqualToString:@"Europe/Lisbon"])
        return @"WET";
    if ([timeZone isEqualToString:@"Asia/Jakarta"])
        return @"WIT";
    return nil;
}