如何从 C# 中的电话号码获取 UTC 偏移量

Posted

技术标签:

【中文标题】如何从 C# 中的电话号码获取 UTC 偏移量【英文标题】:How to get UTC offset from a phone number in C# 【发布时间】:2015-09-23 19:33:17 【问题描述】:

我有一个移动应用程序,它通过电话号码对用户进行身份验证(类似于 Whatsapp 的登录过程)。

用户登录后,可以创建一个TODO笔记。当他创建笔记时,他还填写了日期。

在数据库中,我想将此日期标准化为 UTC。 例如,如果用户填写日期:06/07/2015 17:00:00 他所在国家/地区的 UTC 偏移量为 +3 然后 06/07/2015 14:00:00 将保存在数据库中。

为此,我需要知道用户所在国家/地区的 UTC 偏移量。

当用户注册时,他提供的仅有的两件事是:

国家代码 电话号码

这些不足以知道 UTC 偏移量,因为输入美国国家代码的用户仍然可能处于多个不同的时区。

我也在使用libphonenumber 来解析上面提到的传入值,但它无法得到我想要的偏移量。

如何解决? (Viber、Line 和 Whatsapp 等其他应用如何处理这种情况?)

【问题讨论】:

为什么不能从设备本身获取时区? 你不能,尤其是手机号码。手机号码没有按地理位置分配。此外,号码可携带性意味着您甚至无法通过号码检测运营商 移动应用程序使用设备的时区信息和/或位置。他们不会试图从数字中猜测。 @AdrianWragg 我会说位置到时区相当简单,一个网络服务调用,请参阅***.com/questions/16086962/… 以获得合适的列表。 如果您有应用程序 - 我认为没有一种语言支持将时间转换为 UTC。在客户端上执行 local->UTC 是您拥有的最佳选择(并且不需要获取时区,当您将其发送到服务器时会更加痛苦)。 【参考方案1】:

我想把你的问题改写成这样:

如何从电话号码中获取时区?

答案是,,您无法仅通过电话号码(包括国家代码)获取时区。

我要做的是查看客户端向您发送完整的DateTimeOffset,其中包括时区,或者带有某种“位置”的DateTime,然后您尝试在服务器上自己引出它.

【讨论】:

这是 XKCD 的解释 - xkcd.com/1129 - 如果简单的“不”还不够的话 :) 我在这个设计上走错了路。更好的方法是按照我在答案中写的那样在客户端做事。【参考方案2】:

正如 Alexi 所说,最好的办法是永远不要在服务器端处理 UTC 转换。相反,客户端将发送已采用 UTC 的日期。根据操作系统中定义的时间偏移(即语言环境),与 UTC 的转换将始终在客户端完成。服务器仅从客户端获取 UTC 日期。

【讨论】:

以上是关于如何从 C# 中的电话号码获取 UTC 偏移量的主要内容,如果未能解决你的问题,请参考以下文章

如何从时区名称中获取时区偏移量

如何使用 pytz 从时区字符串中获取 UTC 偏移量?

如何在 .NET 中的 DST 时间获取 UTC 偏移量

如何在 Rails 中获取 UTC 偏移量?

使用 React Native 获取时区

如何以正确的格式获取 UTC 偏移量(时区)?