如何显示带有日期的时区缩写



我正在获取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);

输出为:

当地时间:2015年3月16日18:38,GMT+5:30

我需要它作为

当地时间:2015年3月16日18:38

请帮忙!

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

[dateFormat setTimeZone:DesiredTimeZone];

然后使用日期格式化程序对其进行格式化:

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

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

欲了解更多详情,请单击此处

IST 实际上是一个模棱两可的缩写。有以色列标准时间,印度标准时间和爱尔兰标准时间。所有这些都缩写为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);

每个时区都有一个区域/城市的名称(少数时区有三个部分),例如欧洲/伦敦亚洲/加尔各答。所有这些都可能有一个缩写,如果观察到夏令时,则有两个缩写,并且具有相同 GMT 偏移量的不同区域可能具有不同的缩写(具有不同偏移量的区域可能使用相同的缩写 - 缩写不是唯一的)。

您可以通过以下片段发现可可知道的区域:

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

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

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

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

对于区域和缩写的列表,只需谷歌。

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

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

+ (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;
}

相关内容

  • 没有找到相关文章

最新更新