将 GMT 时间转换为本地时间的问题

Posted

技术标签:

【中文标题】将 GMT 时间转换为本地时间的问题【英文标题】:Issue in coverting GMT time to Local time 【发布时间】:2013-05-04 17:43:22 【问题描述】:

我当前的设备时间是 --- 2013-05-09 10:23 AM

我用下面的代码将它转换为 GMT

   NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
   dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm a";

   NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
  [dateFormatter setTimeZone:gmt];
   NSString *timeStamp = [dateFormatter stringFromDate:[NSDate date]];
   NSLog(@"time in GMT ------ %@",timeStamp);

我得到了输出

     time in GMT ------  2013-05-10 04:53 AM

然后我找到了我的时区

  NSTimeZone *localTime = [NSTimeZone systemTimeZone];
  NSLog(@"local timezone  is------ %@",[localTime name]);

输出

  local timezone  is------ Asia/Kolkata

现在我需要将上面的格林威治时间转换为本地时间。我使用了以下代码

   NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:[localTime name]];
  [dateFormatter setTimeZone:sourceTimeZone];
   NSDate *dateFromString = [dateFormatter dateFromString:timeStamp];
   NSLog(@"local time is ------- %@",dateFromString);

但是我的输出是错误的..

   local time is ------- 2013-05-09 19:23:00 +0000

为什么会这样? 我应该得到当地时间 - 2013-05-09 10:23 AM

【问题讨论】:

【参考方案1】:

您的timestamp 字符串是格林威治标准时间。这意味着当您想要将 GMT 字符串转换回 NSDate 时,您的日期格式化程序需要设置为 GMT,而不是您的本地时区。通过这样做,您将获得正确的NSDate

并且不要忘记,当您记录 NSDate 对象时,它会以 GMT 显示,而不考虑其他任何内容。

【讨论】:

【参考方案2】:

// 获取当前日期/时间

NSDate *today = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
// display in 12HR/24HR (i.e. 11:25PM or 23:25) format according to User Settings
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];
NSString *currentTime = [dateFormatter stringFromDate:today];
[dateFormatter release];
NSLog(@"User's current time in their preference format:%@",currentTime);

【讨论】:

这些都不能解决这个问题。这并不能解释为什么最终输出显示错误的时间。【参考方案3】:

亲爱的,请不要在 google 上做一些努力,这意味着首先在 google 上搜索您的问题,如果在这种情况下您没有得到答案,请将您的问题放在 stackover flow 上。 并在下面的链接中查看您的答案....

    iPhone: NSDate convert GMT to local time iphone time conversion gmt to local time Date/time conversion to user's local time - issue

【讨论】:

【参考方案4】:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm a";

    NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
    [dateFormatter setTimeZone:gmt];
    NSString *timeStamp = [dateFormatter stringFromDate:[NSDate date]];
    NSLog(@"time in GMT ------ %@",timeStamp);



    NSTimeZone *localTime = [NSTimeZone systemTimeZone];
    NSLog(@"local timezone  is------ %@",[localTime name]);


    NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
    [dateFormatter setTimeZone:sourceTimeZone];
    NSDate *dateFromString = [dateFormatter dateFromString:timeStamp];
    NSLog(@"local time is ------- %@",dateFromString);


    NSDateFormatter *dateFormatter1 = [[NSDateFormatter alloc] init];
    dateFormatter1.dateFormat = @"yyyy-MM-dd HH:mm";

    NSTimeZone *gmt1 = [NSTimeZone localTimeZone];
    [dateFormatter1 setTimeZone:gmt1];
    NSString *timeStamp1 = [dateFormatter1 stringFromDate:[NSDate date]];
    NSLog(@"local time is ------- %@",timeStamp1);

输出:

time in GMT ------ 2013-05-10 05:13 AM
 local timezone  is------ Asia/Kolkata
 local time is ------- 2013-05-10 00:13:00 +0000
 local time is ------- 2013-05-10 10:43

【讨论】:

这不能回答问题。目标是将timestamp 正确转换回NSDate【参考方案5】:

尝试使用此代码:

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm a"];

    // get time zone
    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
    NSDate *date = [NSDate date];
    NSString *timeStamp = [dateFormatter stringFromDate:[NSDate date]];
    date = [dateFormatter dateFromString:timeStamp];

    // change time zone
    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"Asia/Kolkata"]];
    // or you can use SystemTimeZone
    // [dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];

    NSString *strDateWithLocalTimeZone = [dateFormatter stringFromDate:date];

    NSLog(@"Local Time Zone Date %@", strDateWithLocalTimeZone);

【讨论】:

以上是关于将 GMT 时间转换为本地时间的问题的主要内容,如果未能解决你的问题,请参考以下文章

将本地时间转换为用户首选时区,将用户首选时区转换为 GMT

将 GMT 日期时间转换为本地时区日期时间

将 UTC/GMT 时间转换为本地时间

如何将日期/时间从 GMT 转换为本地时区

用户日期时间设置为 GMT,如何将日期转换为其本地化设置?

Java/Android - 将 GMT 时间字符串转换为本地时间