iOS - 将从mySQL服务器接收的日期转换为用户本地时间

时间:2012-04-05 10:16:06

标签: mysql objective-c timezone nsdate nsdateformatter

我有一台服务器,用于存储mySQL数据库上用户之间发送的数据的时间,使用NOW()来设置时间。 我试图将时间转换为收件人的当地时间,但没有太多运气(我会在存储之前转换时间,但正如我所说,我希望时间是收件人的本地时间,而不是发件人)。 日期作为字符串返回给应用程序,我尝试按如下方式调整它:

NSString *string1 = [[receivedMessages objectAtIndex:thisRow]objectAtIndex:2];
NSDate *messageDate; 
NSCalendar* cal = NSCalendar.currentCalendar;
NSTimeZone* tz = cal.timeZone;   

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MM dd yyyy hh:mma"];
[formatter setTimeZone:tz];

messageDate = [formatter dateFromString:string1];

它会对日期进行格式化,但不正确。应用程序收到的日期为:

April 5 2012 5:49AM

转换为:

2012-04-05 04:49:00 +0000

我想知道xcode如何计算出日期属于哪个时区?

实际上,我刚刚使用

测试了它
NSTimeZone *pst = [NSTimeZone timeZoneWithAbbreviation:@"PST"];

取代

 NSCalendar* cal = NSCalendar.currentCalendar;
 NSTimeZone* tz = cal.timeZone;

它仍然给我时间2012-04-05 04:49:00 +0000。

有人有什么想法吗?

非常感谢

1 个答案:

答案 0 :(得分:2)

From the Apple docsmessageDate = [formatter dateFromString:string1];将返回NSDate。当您显示结果时,您正在打印一个NSDate对象(我猜)它被“字符串化”到ISO 8601 date。这些NSDate对象被标准化为绝对时间(没有时区信息)。

获得日期对象后,只需更进一步并格式化输出。我猜你显示的是原始时间,所以这很好(dateFromString将转换为'绝对时间')。您需要添加的内容类似localizedStringFromDate:dateStyle:timeStyle:,以便在本地获得时间。

//If this is not in UTC, we don't have any knowledge about
//which tz it is. MUST BE IN UTC.
dateString = "2012-03-12 9:53:23"

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MM dd yyyy hh:mma"];

NSDate *date = [formatter dateFromString:dateString];

NSString *result = [NSDateFormatter localizedStringFromDate:date dateStyle:NSDateFormatterShortStyle timeStyle:NSDateFormatterShortStyle];

//The result should be in MY timezone automatically.