我正在获取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 并将其加载到应用程序中。
给定任何NSDate
和NSTimeZone
使用 abbreviationForDate:
来确定 OS X 是否知道缩写;如果它不使用name
和isDaylightSavingsForDate:
索引到您自己的表中。
对于区域和缩写的列表,只需谷歌。
或
如果你对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;
}