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

iOS-将从mySQL服务器接收的日期转换为用户本地时间,mysql,objective-c,timezone,nsdate,nsdateformatter,Mysql,Objective C,Timezone,Nsdate,Nsdateformatter,我有一个服务器,它在mySQL数据库上存储用户之间发送数据的时间,使用NOW()设置时间。 我试图将时间转换为收件人的本地时间,但运气不太好(我会在存储之前转换时间,但正如我所说,我希望时间是收件人的本地时间,而不是发件人的本地时间)。 日期作为字符串返回到应用程序,我已尝试按如下方式调整它: NSString *string1 = [[receivedMessages objectAtIndex:thisRow]objectAtIndex:2]; NSDate *messageDate; N

我有一个服务器,它在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的时间

有人有什么想法吗

非常感谢

messageDate=[formatter dateFromString:string1]将返回NSDate。当您显示结果时,您正在打印一个NSDate对象,该对象(我猜)已“字符串化”为。这些NSDate对象被标准化为绝对时间(没有时区信息)

一旦有了日期对象,只需进一步格式化输出。我猜您显示的tz是原始时间,因此这很好(
dateFromString
将转换为“绝对时间”)。你所需要添加的就是在本地获取时间

//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.

我不确定我是否完全明白你的意思。对我来说,现在解释它是如何工作的可能更容易些。当用户发送数据时,记录的时间是服务器上的时间,即GMT。但是,如果发送者在纽约,接收者在东京,则GMT对接收者不好,在纽约的时间也不好。因此,我需要将提供给用户的GMT时间转换为本地时间,但我不知道localizedStringFromDate如何做到这一点。据我所知,这只是为了格式化日期的结构,而不是改变它的值?还是我误解了如何使用它?当您从服务器检索日期时,它的格式是什么?字符串ISO 8601:
2012-02-28009:13:23Z
,常规字符串:
2012年4月5日12:34AM
,POSIX:
123582342
?它看起来完全像这样:2012-04-05 16:14:00,看起来最像IOS 8601版本,但我没有任何t或Z。如果不知道日期存储的细节,很难说,但结果是日期应该存储在绝对时间中。例如,ISO 8601日期通常存储为或UTC的偏移量。如果你知道数据库中的日期是绝对的,你就不必担心发送者的tz。您只需在接收者的区域设置中设置“绝对”日期的格式。我将用示例代码更新我的帖子。好的,我想我明白了,我只是尝试更改我的代码以类似于你的示例(必须重新更改setDateFormat,但只是按照我想要的方式)。现在似乎正在工作,因为GMT和UTC是相同的(据我所知)。非常感谢:-)