如何通过 UTC 偏移量确定时区?

2024-02-14

我有一个场景,我有一个时区偏移(以分钟为单位),需要确定它的时区。我知道所有数据都不可用(例如,可能有几个时区的偏移量为 -240 分钟),但“最佳猜测”是可以接受的。

我的第一遍看起来像这样:

foreach (var info in TimeZoneInfo.GetSystemTimeZones())
{
    if (info.BaseUtcOffset.TotalMinutes == timezoneOffset)
    {
         // do something here if this is a valid timezone
    }
}

这种方法可行,但我需要考虑夏令时,这有点让我失望。我添加了这个可怕的黑客:

foreach (var info in TimeZoneInfo.GetSystemTimeZones())
{
    var extra = info.IsDaylightSavingTime(DateTime.Now) ? 60 : 0;
    if (info.BaseUtcOffset.TotalMinutes + extra == timezoneOffset)
    {
         // do something here if this is a valid timezone
    }
}

这“足够好”,因为我可以在夏令时未生效时向用户显示正确的时间,并且在 DST 期间大约 70% 正确。不过……这对我来说是一些糟糕的代码。

有一个更好的方法吗?更优雅就更好了,更准确就更好了。

Update

从技术上讲,我可以访问 Javascript 可以获得的有关日期的任何信息。我在一个页面上放置了一个名为“offset”的隐藏字段。我有一个 JQuery 函数,它使用 DateTime().getTimezoneOffset() 填充偏移字段。虽然我在 DateTime 对象上没有看到任何有帮助的内容,但也许这会打开其他的想法途径。


简短的回答:你不能。

夏令时使其不可能。例如,仅根据 UTC 偏移量,无法确定夏季亚利桑那州和加利福尼亚州之间的差异,或冬季亚利桑那州和新墨西哥州之间的差异(因为亚利桑那州不遵守 DST)。

还有不同国家遵守夏令时的时间问题。例如,美国的 DST 比欧洲更早开始并更晚结束。

可以进行近似猜测(即+/-一小时),但如果您使用它向用户显示时间,您将不可避免地向其中一些人显示错误的时间。


Update:从评论来看,您的主要目标似乎是显示用户本地时区的时间戳。如果这就是您想要做的,您应该将时间作为 UTC 时间戳发送,然后使用 Javascript 在用户的浏览器上重写它。如果他们没有启用 Javascript,他们仍然会看到可用的 UTC 时间戳。这是我想出的一个函数这个问题 https://stackoverflow.com/questions/1214234/javascript-date-parsing-bug-fails-for-dates-in-june,我用过这个油猴脚本 https://meta.stackexchange.com/questions/12635/greasemonkey-script-to-display-absolute-timestamps-in-local-time。您可能需要对其进行调整以满足您的需求。

//@param timestamp An ISO-8601 timestamp in the form YYYY-MM-DDTHH:MM:SS±HH:MM
//Note: Some other valid ISO-8601 timestamps are not accepted by this function
function parseISO8601(timestamp)
{
  var regex = new RegExp("^([\\d]{4})-([\\d]{2})-([\\d]{2})T([\\d]{2}):([\\d]{2}):([\\d]{2})([\\+\\-])([\\d]{2}):([\\d]{2})$");
  var matches = regex.exec(timestamp);
  if(matches != null)
  {
    var offset = parseInt(matches[8], 10) * 60 + parseInt(matches[9], 10);
    if(matches[7] == "-")
      offset = -offset;

    return new Date(
      Date.UTC(
        parseInt(matches[1], 10),
        parseInt(matches[2], 10) - 1,
        parseInt(matches[3], 10),
        parseInt(matches[4], 10),
        parseInt(matches[5], 10),
        parseInt(matches[6], 10)
      ) - offset*60*1000
    );
  }
  return null;
}

这是我在博客上使用的一个函数,用于显示用户本地时区中已解析的时间戳。同样,您可以将其调整为您想要的格式。

var weekDays = new Array("Sunday", "Monday", "Tuesday", "Wednesday",
        "Thursday", "Friday", "Saturday");
var months = new Array("January", "February", "March", "April", "May", "June",
        "July", "August", "September", "October", "November", "December");

function toLocalTime(date)
{
  var hour = date.getHours();
  var ampm = (hour < 12 ? "am" : "pm");
  hour = (hour + 11)%12 + 1;

  var minutes = date.getMinutes();
  if(minutes < 10)
    minutes = "0" + minutes;

  return weekDays[date.getDay()] + ", "
       + months[date.getMonth()] + " "
       + date.getDate()          + ", "
       + date.getFullYear()      + " at "
       + hour                    + ":"
       + minutes                 + " "
       + ampm;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过 UTC 偏移量确定时区? 的相关文章

随机推荐

  • HTML 5 音频当前位置

    将 HTML 5 与 DOM 一起使用 有没有办法获取用户正在播放音频文件的当前位置 并在稍后返回到该位置 See the HTML媒体元素 http dev w3 org html5 spec Overview html htmlmedi
  • 使用 **kwargs 将 **kwargs 参数传递给另一个函数

    我不明白下面的例子 假设我有这些功能 python likes def save filename data kwargs fo openX filename w kwargs lt 1 fo write data fo close pyt
  • Omniauth-facebook 登录无法正常工作

    当我尝试使用omniauth facebook 登录我的Rails 应用程序时 出现以下错误 这是在 localhost 3000 上测试时 不安全登录被阻止 您无法从不安全页面获取访问令牌或登录此应用程序 尝试将页面重新加载为 https
  • 命令设计模式 - 调用者是可选的吗?

    Command 设计模式中 Invoker 类是可选的吗 客户端需要实例化命令的具体命令和接收器 客户端是否总是需要实例化 Invoker 并将命令对象传递给 Invoker 对象 稍后 每当客户端需要执行命令时 客户端只需询问 Invok
  • FizzBu​​zz 列表理解

    当我学习 python 时 我正在摆弄一些不同的 fizzuzz 脚本 我发现这个效果很好 但我无法破译它是如何工作的 我知道正常的嘶嘶声如何与 for 循环和 if i 3 0 and i 5 0 一起工作 让我困惑的是如何 Fizz n
  • 批处理文件创建另一个批处理文件,如何在写入行时忽略命令?

    我正在编写的 Windows 批处理文件遇到了一些问题 我需要批处理文件将一些特定行写入另一个批处理文件 我一直使用的方法是 type NUL gt batchfile bat ECHO texttobewrittentofile gt g
  • Spark 2.x 的 Spark.sql.crossJoin.enabled

    我正在使用 预览 Google DataProc Image 1 1 和 Spark 2 0 0 为了完成我的一项操作 我必须完成笛卡尔积 从2 0 0版本开始 创建了一个spark配置参数 spark sql cross Join ena
  • Perl 抛出“参考键是实验性的”

    开发环境为OS X 10 10 3 Perl v This is perl 5 version 18 subversion 2 v5 18 2 built for darwin thread multi 2level with 2 regi
  • lambda 表达式中的枚举的编译方式不同;重载解析改进的结果是什么?

    在尝试 Visual Studio 2015 RC 时 我收到了先前工作代码的运行时错误 给定 lambda x gt x CustomerStatusID CustomerStatuses Active 它被传递给一个函数作为Expres
  • 在 Google Market 上发布一款应用的多个版本

    我有一个 Android 应用程序 我想用它来显示高质量的图像 然而 有许多不同的屏幕尺寸和比例 我知道有一些过滤器可以在市场中显示仅适用于小 中 大屏幕设备的应用程序 如果我将两种尺寸的图像放入 1 个应用程序中 应用程序的大小将会增加一
  • 在 RSA 下解码有效负载后未获得相同的会话密钥

    使用以下使用 crypto 库的函数对其进行编码和解码后 我没有获得相同的会话密钥 CryptoPP RSA PrivateKey RSA master privKey CryptoPP RSA PublicKey RSA master p
  • 启动/广播接收器重启问题

    这是一个相当常见的问题 但我失去了理智 我想我已经彻底满足了要求 我希望 BroadcastReceiver 在手机重新启动时执行某些操作 我的广播接收器 用于启动 public class BootReceiver extends Bro
  • Python 闭包和单元格(封闭值)

    Python 的机制是什么使得 lambda x for x in range 5 2 is 4 将 x 的副本绑定到每个 lambda 表达式以使上述表达式等于 2 的常用技巧是什么 我的最终解决方案 for template model
  • 如何让 Chrome 浏览器版本现在与 Python 一起运行? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在使用 selenium 运行一个应用程序 并且在运行 Chrome 驱动程序之前我想知道安装的实际 chrome 浏览器版本 以避免出
  • 如何在 LLVM 中将 genericValue 转换为 Value?

    我从事口译工作 我在内存中有一个变量的地址 我设法从它中获取实际值 并使用 LoadValueFromMemory 函数将其放入 genericValue 中 现在我需要创建一个 StoreInst 并希望将获得的值放入 Value 对象中
  • 带有 where 子句的 SQL 窗口函数?

    我正在尝试为用户关联两种类型的事件 我想查看所有事件 B 以及该用户在 A 事件之前的最新事件 A 如何实现这一目标呢 特别是 我正在尝试在 Postgres 中做到这一点 我希望可以在窗口函数中使用 where 子句 在这种情况下 我基本
  • Flutter:读取 BloC 状态的 Stream 数据,如果发生变化则重新渲染 UI

    我在使用 BloC 模式并结合使用 Dio 显示下载过程时遇到问题 谁能告诉我 如何从 dio 获取 onUploadProgress 进入块状态并在状态内的进度更新时显示它 目前我有 UI BloC 和 API 类 我需要将我的块传递到
  • 在 Woocommerce 中更改移动设备上的 FlexSlider 选项

    默认情况下 在单个产品页面上启用选项 controlNav 缩略图 桌面版没问题 但在移动设备上我希望 controlNav true 点 我尝试使用 ajax 来完成此操作 但我认为我需要以某种方式使用 Flex 幻灯片刷新该片段以应用过
  • 我应该对 UDP 使用(非阻塞)NIO 吗?

    根据这个帖子 https stackoverflow com questions 569555 non blocking udp i o vs blocking udp i o in java UDP 只是不阻塞 使用 非阻塞 NIO AP
  • 如何通过 UTC 偏移量确定时区?

    我有一个场景 我有一个时区偏移 以分钟为单位 需要确定它的时区 我知道所有数据都不可用 例如 可能有几个时区的偏移量为 240 分钟 但 最佳猜测 是可以接受的 我的第一遍看起来像这样 foreach var info in TimeZon