将 UTC 日期时间全局转换为用户指定的本地日期时间

2023-12-12

我将所有 DateTime 字段存储为 UTC 时间。当用户请求网页时,我想采用他的首选本地时区(而不是服务器计算机的本地时区)并自动将所有 Web 表单中的所有日期时间字段显示为本地日期。

当然,我可以在每种表单中的每个 DateTime.ToString() 调用上应用转换或实现一些辅助实用程序,但这是一项耗时的任务,而且还有一些 3rd 方组件很难使用自定义 DateTime 显示模板进行配置。

本质上,我想让 DateTime 类的行为如下:

from this moment on for this web request, 
whenever some code calls DateTime.ToString(), convert it to the local time 
        using the timezone offset given at the very beginning of the web request, 
but if possible, please keep .NET core library DateTime.ToString() calls intact 
       (I don't want to mess up event logging timestamps etc.)

有什么办法可以做到吗?

顺便说一句,如果重要的话,我正在使用 ASP.NET MVC 4。


您不能直接按照您的要求进行操作,但我会建议一些替代方案。正如尼古拉斯指出的,HTTP 中没有任何内容可以直接为您提供时区。

Option 1

  • 首先,确定您要使用哪种类型的时区数据。有两种不同的类型可用,您可以使用 Microsoft 时区访问TimeZoneInfo类,或世界其他地区使用的 IANA/Olson 时区。在这里阅读更多信息。我的建议是后者,使用提供的实现NodaTime.

  • 然后确定您要转换到的时区。您应该允许您的用户在某处设置来选择他们的时区。

    • 您可能会显示一个下拉列表来选择多个时区之一,或者您可能会执行一些更有用的操作,例如显示世界地图,他们可以单击以选择他们的时区。有几个库可以在 Javascript 中执行此操作,但我最喜欢的是this one.

    • 您可能想要猜测要使用的默认时区,以便在他们从列表(或地图)中进行选择之前您可以尽可能准确。有一个很棒的图书馆叫做js时区检测。它将询问浏览器的时钟并对其可能所在的时区做出最佳猜测。这是相当不错的,但仍然只是一个猜测。不要盲目地使用它——但一定要用它来确定一个起点。Update您现在也可以这样做moment.tz.guess(), 在里面时刻时区moment.js 的组件。

  • 现在您知道了用户的时区,您可以使用该值来转换您的 UTCDateTime值到该本地时区。不幸的是,您无法在线程上设置任何内容来执行此操作。当您更改系统时区时,它对于所有进程和线程都是全局的。所以你别无选择,只能将时区传递到你发回的每个地方。 (我相信这是你的主要问题。)看到这个almost在此重复。

  • 在将其转换为字符串之前,您还需要知道用户的区域设置(可以从请求.UserLanguages价值)。您可以将其分配给当前线程,也可以将其作为参数传递给DateTime.ToString()方法。这不会进行任何时区转换 - 它只是确保数字位于正确的位置,使用正确的分隔符以及工作日或月份名称的适当语言。

Option 2

Don't将其转换为服务器上的本地时间。

  • 既然您说您正在使用 UTC 值,请确保它们.Kind财产是Utc。您可能应该在从数据库加载时执行此操作,但如果必须,您可以手动执行此操作:

    myDateTime = DateTime.SpecifyKind(myDateTime, DateTimeKind.Utc);
    
  • 将其作为纯 UTC 以 ISO8601 等不变格式发送回浏览器。换句话说:

    myDateTime.ToString("o");  // example:  "2013-05-02T21:01:26.0828604Z"
    
  • 在浏览器上使用一些 JavaScript 将其解析为 UTC。它将自动获取浏览器的本地时间设置。一种方法是使用内置的DateJavaScript 中的对象,如下所示:

    var dt = new Date('2013-05-02T21:01:26.0828604Z');
    

    但是,这仅适用于支持 ISO-8601 格式的较新浏览器。相反,我建议使用moment.js图书馆。它在浏览器之间保持一致,并且对 ISO 日期和本地化有更好的支持。另外,您还可以获得许多其他有用的解析和格式化功能。

    // pass the value from your server
    var m = moment('2013-05-02T21:01:26.0828604Z');
    
    // use one of the formats supported by moment.js
    // this is locale-specific "long date time" format.
    var s = m.format('LLLL');
    

选项 1 的优点是您可以使用任何时区的时间。如果您可以从下拉列表中询问用户他们的时区,那么您不需要使用任何 Javascript。

选项 2 的优点是您可以让浏览器为您完成一些工作。如果您要发送原始数据(例如对 WebAPI 进行 AJAX 调用),这是最好的方法。然而,JavaScript 只知道 UTC 和浏览器的本地时区。所以如果你需要转换成other zones.

您还应该注意,如果您选择选项 #2,您可能会受到 ECMAScript 5.1 设计缺陷的影响。如果您使用的日期所涵盖的夏令时规则集与当前有效的不同,那么这一点就会发挥作用。您可以阅读更多内容在这个问题中, and 在我的博客上.

如果我们在 HTTP 标头中包含一些时区信息,那就容易多了,但不幸的是我们没有。虽然需要克服很多困难,但这是同时具有灵活性和准确性的最佳方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 UTC 日期时间全局转换为用户指定的本地日期时间 的相关文章

  • 如何获取正在访问 ASP.NET 应用程序的当前用户?

    为了获取系统中当前登录的用户 我使用以下代码 string opl System Security Principal WindowsIdentity GetCurrent Name ToString 我正在开发一个 ASP NET 应用程
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 重载<<的返回值

    include
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • 如何在 CMake 文件中添加链接器或编译标志?

    我正在使用arm linux androideabi g 编译器 当我尝试编译一个简单的 Hello World 时程序编译得很好 当我通过在该代码中添加一个简单的异常处理来测试它时 它也可以工作 添加后 fexceptions 我猜它默认
  • 如何在 onSnapshot 之外从 firestore DB 获取数据

    当我尝试从 firestore 获取值并将其放入变量时 结果未定义 但在控制台中有效 My code this db collection Users doc uid get then docSnapshot gt if docSnapsh
  • bootstrap:从 show.bs.modal 事件中抑制模态

    是否可以告诉 bootstrapNOT显示模式 通过返回false从内部到框架show bs modal event EDIT 使用 stopPropagation 或简单地disable按钮不是我想要的 我想处理逻辑inside show
  • 在插入查询中动态选择列名

    收到错误列名 ColumnNames 无效 在最后一行 插入子句 知道为什么吗 Declare ColumnNames varchar 2000 Declare OrderId int set OrderId 110077 select C
  • Android studio logcat 窗口日志级别过滤器丢失

    我的打印屏幕 我不知道如何解决它 即使我尝试过解决这些问题 类似问题1 类似问题2我的android studio版本是2021 3 1 这就是New Logcat 更新 海豚 如果你想放置级别过滤器那么你只需要写level error l
  • 以编程方式设置 Android IP、DNS、GATEWAY 设置

    如何从 android java 设置 wifi ip 地址 dns 地址 网关 即以编程方式设置 我没有找到任何能够存储这些值的方法 您可以通过编程方式更改系统设置 首先 您需要在 AndroidManifest xml 中请求 WRIT
  • 捕获 iframe 的屏幕截图 - html2canvas 不起作用

    我有以下 iframe 我只是想捕获 iframe 内容的屏幕截图 我已经尝试过 html2canvas 但它似乎不起作用 我尝试过将 iframe 放入 div 中 但没有任何乐趣 我见过使用 php 实现此目的的各种方法 但似乎没有什么
  • 用多字符字符串替换字符

    我正在尝试替换德语和荷兰语变音符号 例如 or 它们应该写成ae代替 所以我不能简单地将一个字符翻译成另一个字符 有没有更优雅的方法来做到这一点 实际上它看起来像这样 尚未完成 SELECT addr REPLACE REPLACE add
  • Android:如何获取文件的创建日期?

    这是我的代码 File TempFiles new File Tempfilepath if TempFiles exists String child TempFiles list for int i 0 i lt child lengt
  • git分支可以用数字列出吗?

    我想知道是否有人构建了一个脚本或有办法列出带有数字的 git 分支 以便代替这个 最好在 bash 中 feature myusername ID 1111 my branch name feature myusername ID 2222
  • django:控制json序列化

    有没有办法在django中控制json序列化 下面的简单代码将返回 json 中的序列化对象 co Collection objects all c serializers serialize json co json 将类似于以下内容 p
  • Git 中的子模块、子树或其他依赖项?

    我有一个较大的项目 其中有很多模块 库及其各自的存储库 这些模块中的大多数是其他模块的依赖项 而不是项目的依赖项 现在已经到了主项目有多个子项目并且许多模块被共享的地步 有些依赖关系的深度超过 3 4 层 我读过可以在项目内部更新 拉取子模
  • 调用 async fns 时创建值流?

    我不知道如何提供Stream我在哪里await异步函数来获取流值所需的数据 我尝试过实施Stream直接使用特质 但我遇到了问题 因为我想使用异步的东西 比如awaiting 编译器不希望我调用异步函数 我认为我缺少一些关于目标的背景知识S
  • 使用 Apache (.htaccess) 将 WWW 转换为非 WWW URL(删除 WWW)

    我必须将我的网站从https www example com to https website com SSL已正确安装在我的服务器上 我在用Apache并且必须使用来做到这一点Apache 任何一个httpd conf ssl conf
  • 如何使用Python的pip下载并保存包的压缩文件?

    如果我想使用pip命令下载包 及其依赖项 但是keep下载的所有压缩文件 例如 django socialregistration tar gz 有办法做到这一点吗 我尝试过各种命令行选项 但它似乎总是解压并deletezipfile 或者
  • cocoapods - “pod 安装”需要很长时间

    我试图用以下命令更新现有的 Podpod install命令 但需要永远运行 详细模式显示它卡在下一行 永远 更新规范存储库master usr bin git pull no rebase no commit 卡住后没有网络活动 我遇到了
  • AppWidgetProvider问题

    我有一个 AppWidgetProvider 当小部件首次添加到主屏幕时 我需要进行一些初始化 据我所知 执行此操作的位置是在 onEnabled Context context 方法中 我的问题是这个方法永远不会被调用 据我在 logca
  • C++ 库包含

    我对 C 比较陌生 第一次需要使用库 我希望有人能够向我展示如何正确地 链接到 包含 该库 我想使用的库是 ID3 v3 8 8 可以在这里找到 http id3lib sourceforge net 我已经下载了 Windows 二进制文
  • Java SystemV 时区和 JodaTime

    我正在使用 Joda Time 在 Java 应用程序中处理时区 我在尝试从 java 时区的 id 构建 DateTimeZone Joda Time 对象时遇到问题 乔达扔出一个 java lang IllegalArgumentExc
  • 将 UTC 日期时间全局转换为用户指定的本地日期时间

    我将所有 DateTime 字段存储为 UTC 时间 当用户请求网页时 我想采用他的首选本地时区 而不是服务器计算机的本地时区 并自动将所有 Web 表单中的所有日期时间字段显示为本地日期 当然 我可以在每种表单中的每个 DateTime