将 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 日期时间全局转换为用户指定的本地日期时间 的相关文章

  • 浮点等于的意外结果

    问题不在于为什么0 1 0 9不等于1 0 这是关于平等者的不同行为 有人可以解释为什么下面的示例的工作方式不同 float q 0 1f float w 0 9f float summ q w q w 1 0f False summ 1
  • 调用事件,h(args) 与 EventName?.Invoke()

    我总是这样调用事件 void onSomeEvent string someArg var h this EventName if h null h this new MyEventArgs someArg 今天 VS 2015 告诉我这可
  • 通过 Office API 将多个 Word 文档保存为 HTML

    我有大量的Word文档需要解析 由于它们都是从同一个模板创建的 我认为最好的方法是将它们保存为 HTML 文件并解析 HTML 本身 虽然将单个 Word 文档保存为 HTML 相当容易 但我还没有找到从 Word 内部执行批量过程的方法
  • ToLookup 是否强制立即执行序列

    我正在调查可枚举 ToLookup将可枚举序列转换为字典类型数据结构的 API 更多详情可在这找到 https msdn microsoft com en us library system linq enumerable tolookup
  • 删除 QComboBox“下拉”动画

    我正在使用 Qt 4 8 并且想在单击 QComboBox 时摆脱 下拉 动画 我也想稍微移动一下 到目前为止 我一直在考虑重新实现 showPopup 和 hidePopup 但不知道如何使其工作 此外 每次我尝试使用 CSS 进行移动或
  • 如何在 TargetFrameworks 标记中每个框架运行一次的目标之前创建仅运行一次而不是一次的 MSBuild 目标?

    我有一个我部分拥有的代码生成器工具 现在 csproj 文件可以在其中列出多个目标框架并构建所有这些框架 我试图弄清楚如何使 MSBuild 目标仅在每个目标中生成一次代码无论列出了多少个目标框架 都将运行构建 并让每个目标框架的编译等待代
  • Control.Invoke 在隐藏的 ShowDialog 中“卡住”

    我有解决这个问题的方法 但这不是我第一次被咬 所以我试图确切地了解发生了什么 从我的申请中 我ShowDialog表单 表单上有一个按钮 单击该按钮时会调用另一个 非 GUI 线程上的代码 非 GUI 线程发回状态 Pushed then
  • Microsoft ASP.NET Web Pages 2 Data Nuget 包的用途是什么?

    据我了解 ASP NET MVC 4 项目所需的最低 Nuget 包是 微软 ASP NET MVC 4 微软 ASP NET 剃刀 2 微软 ASP NET 网页 2 微软网络基础设施 不过我很想知道 以下包会添加到项目中什么 Micro
  • 私有方法和属性的 JetBrains Rider C# 命名风格

    我想将私有方法的首字母设为小写 将公共方法的首字母设为大写 然而 在 Rider 中 C 命名风格下似乎只有一个选项可以应用所有方法 属性和事件 告诉 Rider 仅对私人使用不同约定的最佳方式是什么 也可以看看 私有方法和属性的 ReSh
  • 将数据表传递给存储过程

    我有一个用 C 创建的数据表 using DataTable dt new DataTable dt Columns Add MetricId typeof int dt Columns Add Descr typeof string dt
  • 为什么(错误地)使用 ref myarray[0] 传递数组可以工作,但仅在 32 位应用程序中有效?

    我在一些互操作中做了一些愚蠢的事情 使用DllImport 在某一时刻 但它仍然可以在 32 位机器上运行 在 64 位应用程序上做了哪些不同的操作 以及为什么 导致方法 1 的行为不同 方法一 错误的方法 ref byte param S
  • DISM.exe 返回代码?

    我有一个程序调用 dism exe 程序 它在后台运行一些命令 现在 我只检查返回代码 0 或其他任何内容 以显示进程失败或成功 我可以用什么来交叉检查返回代码以获得准确的返回错误 DISM 参考了哪些回报 评论中提供的链接DISMAPI
  • C++ 按值而不是按引用将数组发送到函数

    我的 C 有问题 我有一个对数组进行排序的函数 但我不想处理原始数组 我想通过值而不是通过引用将数组发送到函数 请帮我 int bogoSort int tab int n int iloscOperacjiDominujacych 0 c
  • 在函数内部使用时,c 数组大小会发生变化

    我有这段代码 include
  • 函数的动态返回类型

    如何创建一个具有基于参数类型的动态返回类型的函数 Like protected DynamicType Test DynamicType type return 为此 您必须使用泛型 例如 protected T Test
  • 修改排列算法以防止重复打印输出的策略

    我一直在审查实践算法 目前正在研究一种我非常喜欢的排列算法 void permute char set int begin int end int range end begin if range 1 cout lt lt set lt l
  • thread_local成员变量构造

    我遇到了 thread local 的一些奇怪行为 不确定我是否做错了什么或者这是一个 GCC 错误 我有以下最小重现场景 include
  • 从 C++ 检索 Python 类型

    这个问题实际上是以下两个问题的延伸 如何在 Python 中实现 C 类 以供 C 调用 https stackoverflow com questions 9040669 how can i implement a c class in
  • 文件/文件夹结构的递归搜索

    我正在尝试为返回文件和文件夹列表的 Web 服务构建递归搜索功能 我创建了这两个方法 因此它们充当递归搜索 它首先获取顶级内容 然后将任何文件添加到 fileList 并将任何子文件夹添加到 subFoldersList 我们传入访问级别
  • 警告 C4172:返回局部变量或临时变量的地址[重复]

    这个问题在这里已经有答案了 可能的重复 指向局部变量的指针 https stackoverflow com questions 4570366 pointer to local variable 我在这个网站上阅读了很多关于同一问题的其他主

随机推荐

  • 如何在 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