我必须格式化日期如下:

2014年7月19日10:27:16 IST

我怎样才能做到这一点?我应该将“IST”作为字符串对象发送吗?

我试过了 -

NSDate* sourceDate = [NSDate date];
NSLog(@"Date is : %@", sourceDate);

NSTimeZone *currentTimeZone = [NSTimeZone localTimeZone];
NSLog(@"TimeZone is : %@", currentTimeZone);

NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]init]  ;
dateFormatter setDateFormat:@"dd-MMM-yyyy HH:mm:ss Z"];
[dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];

NSLog(@"%@",[dateFormatter stringFromDate:sourceDate]);

最佳答案

我已经根据Apple's official docsUnicode date-formatter standards尝试了几种时区格式化程序的方案。

我这样设置时区:

NSTimeZone *_timezone = [NSTimeZone timeZoneWithName:@"IST"];

它使用+0530偏移量向我提供了正确的时区,因此用于我的NSDateFormatter实例。
NSDateFormatter *_dateFormatter = [[NSDateFormatter alloc]init];
[_dateFormatter setTimeZone:_timezone];

这是有关我使用不同的format-scpecifiers的列表:
  • z = GMT+0530 IST
  • zz = GMT+0530 IST
  • zzz = GMT+0530 IST
  • zzzz = India Standard Time IST
  • zzzzz = India Standard Time IST

  • 似乎没有一个标准格式说明符只能以字符串形式提供实际的"IST",匹配的是带有格式说明符"India Standard Time IST"zzzzzzzzz –但是您可以看到"GMT+0530 IST"仍然包含其余格式符。

    注意:其他格式说明符,例如ZvVxX似乎也没有用。

    我已经阅读了有关格式说明符的更多信息,文档中介绍了有关使用z的信息:

    简短的特定非位置格式(例如PDT)。在不可用的地方,请使用简短的本地化GMT格式。

    对我来说,这意味着印度标准时间的实际短小特定非位置格式无法通过NSDateFormatter直接获得-或出于某种原因被指定为"GMT+0530 IST"而不是短"IST"†。

    另一方面,我不确定服务器端是否接受了长整型非位置格式(aka "India Standard Time IST"),或者时区必须仅由字符串"IST"标记。

    恐怕只有最新的格式,您才需要手动和大胆地添加它,例如:
    [_dateFormatter setDateFormat:@"dd-MMM-yyyy HH:mm:ss"];
    NSString *_date = [[_dateFormatter stringFromDate:[NSDate date]] stringByAppendingString:@" IST"];
    

    注意:我也发现月份的名称也应该大写,我不确定这是另一个期望还是月份名称的通用大写(例如“Jul”,“Sep”等...)对您的服务器端来说已经足够好了–在我目前的回答中,我没有大写它们。

    †我没有找到任何可以描述实际短格式的标准,因此基于unicode标准,我认为"IST"应该是"GMT+0530 IST"的缩短格式,但这只是基于我个人的推测。

    10-08 12:30