【问题标题】:Convert date from timezone to device local timezone and date将日期从时区转换为设备本地时区和日期
【发布时间】:2014-01-28 12:15:08
【问题描述】:

如何将 timezone1 的日期转换为设备本地 timezone2 的日期?

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
[dateFormat setTimeZone:[NSTimeZone timeZoneWithName:@"Asia/Jerusalem"]];
NSDate *date = [dateFormat dateFromString:timestamp];

then something like:
[dateFormat2 setTimeZone:[NSTimeZone localTimeZone]];
date2 = [dateFormat2 dateFromDate:date withOtherTimeZone:zone];

更新:

我想我明白了。

//get source date from the server
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
NSDate *sourceDate = [dateFormat dateFromString:timestamp];

//set timezones
NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithName:@"Asia/Jerusalem"];
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];

//calc time difference
NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;

//set current real date
NSDate* date = [[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate];

还好吗?

【问题讨论】:

  • 你可能想先做一点学习。 NSDate 没有“时区”。
  • 你不应该。以不同的格式和时区向用户显示日期是一回事,但几乎没有理由实际转换 NSDate。为什么你认为你需要?
  • 我们的应用中有一个聊天部分,用于接收来自服务器的时间戳。时间戳根据服务器的时区,我们希望向用户显示他收到消息的当前时间,而不是全局服务器时间。这可以通过设备的本地时区达到,对吗?

标签: ios timezone nsdate nsdateformatter


【解决方案1】:

好的,首先,时间就是时间。在这一秒,地球上的任何地方,都是同一秒。不要将时间格式视为时间。它不是。所有时间都应该是格林威治标准时间,然后你可以根据时区显示。

Date *d = [NSDate date] ;
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"YYYY-MM-dd HH:mm:ss Z"];
NSTimeZone *nyTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"sometimeabbr."];
NSTimeZone *localTimeZone = [NSTimeZone systemTimeZone];
[df setTimezone: nyTimeZone];
NSLog(@"ny time is %@" , [df stringFromDate: d]);
[df setTimeZone: localTimeZone];
NSLog(@"local time is %@" , [df stringFromDate: d]);

如果给定一个字符串日期并需要转换,请创建 NSDateFormatter 来提取字符串日期。确保设置时区。现在您有了一个 NSDate 对象(NSDates 中没有时区),您可以将其格式化为您想要的任何其他时区。

为了爱,请所有神圣的东西。将时间视为前进的秒数,将时区视为这些时区的格式。

【讨论】:

  • 这是正确答案。服务器中的日期与客户端中的日期相同,只是在将日期转换为字符串进行显示时,它针对不同的时区进行了格式化。此外,如果来自服务器的响应是带有时区的字符串,则 TZ 规范将被忽略(这是正确的做法,因为它可能使用 UTC,所以前面的答案会给出错误的结果,因为它正在强制将时间解释为好像来自某个时区)
【解决方案2】:

这就是答案:

NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithName:@"Asia/Jerusalem"];
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];

//calc time difference
NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;

//set current real date
NSDate* date = [[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate];

【讨论】:

  • 请考虑接受约翰的回答,因为这是正确的做法。
  • 这正是我想要的,谢谢!关于如何在用户的时区显示日期/时间有很多答案,但这个答案实际上创建了一个新的 NSDate 对象,其中包含用户显示的时间。方便。
【解决方案3】:

*不同时区日期快速转换为本地时区日期。

let timeZone1 = NSTimeZone(name: timeZone1Name)
let localTimeZone = NSTimeZone.localTimeZone()

let timeZone1Interval = timeZone1?.secondsFromGMTForDate(timezone1Date!)
let deviceTimeZoneInterval = localTimeZone.secondsFromGMTForDate(timezone1Date!)

let timeInterval =  Double(timeZone1Interval! - deviceTimeZoneInterval)

let originalDate = NSDate(timeInterval: timeInterval, sinceDate: timezone1Date!)

let dateFormater : NSDateFormatter = NSDateFormatter()
    dateFormater.dateFormat = "YYYY-MM-dd HH:mm:ss Z"
NSLog("Converted date: \(dateFormater.stringFromDate(originalDate))")
let dateString = dateFormater.stringFromDate(originalDate)
let localTimeZoneDate = dateFormater.dateFromString(dateString)

*

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 2020-09-08
    • 2021-05-02
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多