【问题标题】:How to offset NSDate with UTC timezone offset without hardcoded manual calculation如何在没有硬编码手动计算的情况下使用 UTC 时区偏移量来偏移 NSDate
【发布时间】:2016-07-19 11:24:14
【问题描述】:

假设当前的当地时间是15:11 UTC。我从服务器中检索了一个数据集,该数据集显示了一个业务的开始关闭时间,如下所示:

{
close = {
   day = 3;
   time = 0200;
};
open = {
   day = 2;
   time = 1700;
};

我还收到一个 utc-offset 属性,如下所示:"utc_offset" = "-420”; 我想这是一个分钟偏移量,给出一个 7 小时的小时偏移量,考虑到我所在的时区是 UTC 和营业地点的营业时间,这似乎是正确的我收到的信息是针对洛杉矶一家落后 7 小时的企业。

我如何使用此属性以便能够对其进行任何时间计算 我想确定当前本地时间是否介于我已经计算出的打开和关闭时间之间,但是考虑到时间比较是在本地时区完成的,当它需要在计算该时间范围之前进行偏移时,计算结果是错误的.

我试图避免做类似的事情

伪代码: NSDate.date hour componenent + (UTC_offset / 60 = -7 hours)

更新: 以下是我目前检查商家是否正在营业的方式

        if currentArmyTime.compare(String(openInfo.time)) != .OrderedAscending && currentArmyTime.compare(String(closeInfo.time)) != .OrderedDescending {
            //The business is open right now, though this will not take into consideration the business's time zone offset.
        }

偏移当前时间更容易吗?

【问题讨论】:

  • 使用NSDateFormatter解析时间,包括时区
  • 我并不完全清楚你想要什么。很难想象您实际上将UTC作为当地时间,您更有可能在BST?您想在 BST 和 PDT 之间进行转换吗?或者这只是关于解析?您是否阅读了calendar calculations 上的相关 Apple 文档?
  • 如果您是 UTC,则洛杉矶落后 8 小时。只是说。
  • 我认为你们是对的,我可能引用了设备所在的错误时区。
  • @hnh 如问题所示,我想渲染一个时间被给定的整数值偏移。该死的,我本可以仅用这句话来浓缩整个问题。 :D

标签: ios swift nsdate


【解决方案1】:

在日期操作中使用“打开”和“关闭”时间之前,您需要从已设置为这些时间时区的日历创建 NSDate。这是一个例子:

// Create calendar for the time zone
NSInteger timeOffsetInSeconds = -420 * 60;
NSTimeZone *tz = [NSTimeZone timeZoneForSecondsFromGMT:timeOffsetInSeconds];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
calendar.timeZone = tz;

// Create an NSDate from your source data
NSDateComponents *comps = [[NSDateComponents alloc] init];
comps.day = 1;
comps.month = 1;
comps.year = 2016;
comps.hour = 8;
comps.minute = 0;
NSDate *openTime = [calendar dateFromComponents:comps];

// 'openTime' can now be to compared with local time.
NSLog(@"openTime = %@", openTime);  // Result is openTime = 2016-01-01 15:00:00 +0000

您应该将上述代码放入一个方法中,该方法采用原始时间和要应用的时间偏移量。

【讨论】:

  • 您好,谢谢您的回答。你能检查我的问题的更新吗?
  • 我仍在努力弄清楚如何获取当前的 NSDate 对象并添加该偏移量。
  • 我认为除了时间之外,您还需要考虑本地日期。在您的示例数据中,开盘(下午 5 点)和收盘(凌晨 2 点)时间跨度 两天。这可能就是 day 字段的用途。有什么方法可以从您的源数据中确定所有日期组成部分,即除了日期和时间之外的年份和月份?拥有所有日期组件后,使用答案中显示的方法创建开始和结束 NSDates。然后,您可以在这些 NSDates 上使用本机日期操作,而不必担心时区。
猜你喜欢
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-18
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多