2012-07-16 126 views
31

在我的iPhone应用程序中,我非常努力地将web服务响应时间转换为当前设备时间。 webservice time in UTC-5 timezone。该应用程序是全球使用应用程序所以我必须将响应时间转换为当前设备时区。这是简单的消息应用程序。从UTC-5时区日期和时间获取iPhone设备的时区日期和时间iPhone应用程序?

当我发送message the time is "5:05 PM" (India Chennai timezone)但是当我从webservice is "2012-07-16 07:33:01"检索时间。当我在应用程序中显示时间时,我应该将时间转换为设备的当地时间。我以某种方式尝试过,但还不能解决。代码是:

NSDateFormatter *dateFormatter1 = [[NSDateFormatter alloc] init]; 
[dateFormatter1 setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
[dateFormatter1 setLocale:[NSLocale currentLocale]]; 
//[dateFormatter1 setTimeZone:[NSTimeZone timeZoneWithName:@"IST"]]; 
[dateFormatters setTimeZone:[NSTimeZone systemTimeZone]]; 
NSDate *date = [dateFormatter1 dateFromString:dateStr]; 
NSLog(@"date : %@",date); 

但输出日期和时间是2012-07-16 02:03:01 +0000我都存放在此日期/时间在Coredata,当我从CoreData和隐蔽检索到NSString使用下面的代码,

NSDateFormatter *dateFormatters = [[NSDateFormatter alloc] init]; 
[dateFormatters setDateFormat:@"dd-MMM-yyyy hh:mm"]; 
[dateFormatters setDateStyle:NSDateFormatterShortStyle]; 
[dateFormatters setTimeStyle:NSDateFormatterShortStyle]; 
[dateFormatters setDoesRelativeDateFormatting:YES]; 
[dateFormatters setTimeZone:[NSTimeZone systemTimeZone]]; 
dateStr = [dateFormatters stringFromDate:dateString]; 
NSLog(@"DateString : %@", dateStr); 

输出日期和时间是“Today 7:33 AM”。它应该显示“Today 5:05 PM”。任何人都可以保存我的一天吗?请帮助解决这个问题。提前致谢。

+2

我看到一对夫妇错别字是担心我,在你的第二块和情况不一致的MMM为月两者之间小时块 – Eric 2012-07-16 13:03:58

+0

@Eric谢谢。但是,我不明白你在说什么?你能解释一下吗?谢谢。 – Gopinath 2012-07-16 13:06:36

+0

发布从webcervice收到的时间格式的确切示例,您需要将时区文字添加到格式字符串。 – 2012-07-16 13:06:58

回答

74

我测试了您的场景并添加了一些代码供您参考。请测试下面,请让我知道它对你有用。

NSString *dateStr = @"2012-07-16 07:33:01"; 
NSDateFormatter *dateFormatter1 = [[NSDateFormatter alloc] init]; 
[dateFormatter1 setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
NSDate *date = [dateFormatter1 dateFromString:dateStr]; 
NSLog(@"date : %@",date); 

NSTimeZone *currentTimeZone = [NSTimeZone localTimeZone]; 
NSTimeZone *utcTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; 

NSInteger currentGMTOffset = [currentTimeZone secondsFromGMTForDate:date]; 
NSInteger gmtOffset = [utcTimeZone secondsFromGMTForDate:date]; 
NSTimeInterval gmtInterval = currentGMTOffset - gmtOffset; 

NSDate *destinationDate = [[[NSDate alloc] initWithTimeInterval:gmtInterval sinceDate:date] autorelease]; 

NSDateFormatter *dateFormatters = [[NSDateFormatter alloc] init]; 
[dateFormatters setDateFormat:@"dd-MMM-yyyy hh:mm"]; 
[dateFormatters setDateStyle:NSDateFormatterShortStyle]; 
[dateFormatters setTimeStyle:NSDateFormatterShortStyle]; 
[dateFormatters setDoesRelativeDateFormatting:YES]; 
[dateFormatters setTimeZone:[NSTimeZone systemTimeZone]];   
dateStr = [dateFormatters stringFromDate: destinationDate]; 
NSLog(@"DateString : %@", dateStr); 

谢谢。

+1

@Yuvaraj。M,你是否愿意为偏移和间隔计算的三条线添加一些注释?我不太喜欢。 – 2013-03-13 20:46:36

+0

真棒回答,@ yuvaraj – 2015-02-06 05:37:18

+0

这些计算是否照顾DST?如果没有,那么请告诉我我该如何照顾DST。 – 2015-04-14 06:09:54

7
NSDate* currentDate = [NSDate date]; 

NSTimeZone* CurrentTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; 
NSTimeZone* SystemTimeZone = [NSTimeZone systemTimeZone]; 

NSInteger currentGMTOffset = [CurrentTimeZone secondsFromGMTForDate:currentDate]; 
NSInteger SystemGMTOffset = [SystemTimeZone secondsFromGMTForDate:currentDate]; 
NSTimeInterval interval = SystemGMTOffset - currentGMTOffset; 

NSDate* TodayDate = [[NSDate alloc] initWithTimeInterval:interval sinceDate:currentDate]; 
NSLog(@"Current time zone Today Date : %@", TodayDate); 

斯威夫特4

var currentDate = Date() 
var CurrentTimeZone = NSTimeZone(abbreviation: "GMT") 
var SystemTimeZone = NSTimeZone.system as NSTimeZone 
var currentGMTOffset: Int? = CurrentTimeZone?.secondsFromGMT(for: currentDate) 
var SystemGMTOffset: Int = SystemTimeZone.secondsFromGMT(for: currentDate) 
var interval = TimeInterval((SystemGMTOffset - currentGMTOffset!)) 
var TodayDate = Date(timeInterval: interval, since: currentDate) 
print("Current time zone Today Date : \(TodayDate)") 

希望它可以帮助到其他开发商!快乐编码!

+0

你可以把它张贴在迅速? – Chandni 2018-02-15 17:04:26

+0

@Chandni - 可以帮助你 - [UTC/GMT⟺本地](https://stackoverflow.com/questions/11504843/get-current-iphone-device-timezone-date-and-time-from-utc-5 -timezone-日期和TI/48867259#48867259) – Krunal 2018-02-19 13:27:40

1

这个扩展可能会更容易。

斯威夫特4:UTC/GMT⟺本地(电流/系统)

extension Date { 

    // Convert local time to UTC (or GMT) 
    func toGlobalTime() -> Date { 
     let timezone = TimeZone.current 
     let seconds = -TimeInterval(timezone.secondsFromGMT(for: self)) 
     return Date(timeInterval: seconds, since: self) 
    } 

    // Convert UTC (or GMT) to local time 
    func toLocalTime() -> Date { 
     let timezone = TimeZone.current 
     let seconds = TimeInterval(timezone.secondsFromGMT(for: self)) 
     return Date(timeInterval: seconds, since: self) 
    } 

} 


// Try it 
let utcDate = Date().toGlobalTime() 
let localDate = utcDate.toLocalTime() 

print("utcDate - (utcDate)") 
print("localDate - (localDate)")