【问题标题】:Calculate time difference between two NSDates with different locales计算两个具有不同语言环境的 NSDate 之间的时间差
【发布时间】:2013-09-28 17:11:19
【问题描述】:

我有一个格式为 2010-04-23 00:00:00 的当前 NSString,然后我试图获取从当天过去的天数。但是,例如当用户将语言环境更改为泰国时,我不确定如何处理。

这里是一些代码。

NSString *start = @"2010-04-23 00:00:00";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
NSDate *date = [formatter dateFromString:start];

//Region Format Thailand
NSDate *today = [[NSDate alloc] init];
NSTimeInterval difference =  [today timeIntervalSinceDate:start];
int numberOfDays = difference / 86400;

处理这种情况的正确方法是什么,以便天数差异是准确的?

【问题讨论】:

  • 他描述的场景根本不像GMT“日期转换”。他似乎在描述计算日期之间的天数,但可能使用不同的日历。
  • @aahrens,您是在谈论泰国的“约会”而第二个约会在不同的时区/地区,还是都在泰国?或者您是在谈论设备在一个区域设置中,但您需要您正在使用的日期才能使用不同的区域设置?你能用这些信息更新你的问题吗?
  • 必须决定是用绝对 (UTC) 术语还是相对于本地时间来计算差异。如果是绝对/UTC,那么您可以简单地减去 NSDate 对象。如果相对于本地时间(并且两个端点位于不同的时区,或者可能只有一个在 DST 和一个在标准时间),那么您必须使用 NSCalendar/NSDateComponents 或格式化两个日期并解析字符串。
  • 还必须决定是否应该考虑 1/1/2014 23:00 到 1/3/2014 23:59 一天或两天。

标签: ios objective-c nsdate nsdateformatter nstimeinterval


【解决方案1】:

日期很复杂。

如果您想要天、小时、分钟、秒的差异,这很简单:将所有内容转换为 NSDate,计算以秒为单位的差异,然后转换为天、小时、分钟、秒。

除此之外,您需要先定义您真正想要的结果。今天凌晨 1 点和晚上 11 点是同一天,但今天晚上 11 点和明天凌晨 1 点是不同的日子——即使在第一种情况下相差 22 小时,在第二种情况下只有两个小时。所以你必须定义你想要什么。您必须定义哪种情况需要“0 天”的结果,以及哪种情况需要“1 天”的结果。

如果您更改时区,有些日期会移到另一天,有些则不会。

由您决定您想要什么结果。无论如何,我会将所有日期转换为相关时区,提取日期,然后计算天数差异。

【讨论】:

  • 关闭。绝对获取 NSDate 对象,然后使用 NSCalendar API(自 2013 年以来仅在标题和 WWDC 视频中)
【解决方案2】:

您需要将日期转换为纪元时间。
- (NSTimeInterval)timeIntervalSince1970

完成此操作后,您可以使用以下代码,以秒为单位查找时差并进行比较。


NSDate* date1 = [NSDate 日期];
NSDate* date2 = [NSDate 日期];
NSTimeInterval 秒 = [date1 timeIntervalSinceDate:date2];

如果(秒 {
NSLog("少");
}
else if (secs > 0)
{
NSLog("更大");
}
其他
{
NSLog(@"相同");
返回 NSOrderedSame;
}

【讨论】:

  • NSDate已经是一个参考日期后的时间间隔。无需将其转换为 unix 纪元时间,这与不同的参考日期相同。
猜你喜欢
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多