.net JSON序列化器将本地客户端时间返回给浏览器?

2024-01-03

我使用 asp.net [WebMethod] 将 .net 对象推送回浏览器上的 Ajax 调用。 该对象的属性之一是 DateTime 类型。

当它到达浏览器时,时间比 SQL Server 中存储的时间早 7 小时。

好的,我的浏览器位于秘鲁 (GMT-5),服务器位于德国(当前 GMT+2),这就是 7 小时的来源。

作为修复,我通过 Ajax 请求在客户端发送 UTC 偏移量

d = new Date();
d.getTimezoneOffset();

然后在服务器上我计算出那里的偏移量:

  // get a local time zone info
  TimeZoneInfo tz = TimeZoneInfo.Local;

  // get it in hours
  int offset = tz.BaseUtcOffset.Hours;

  // add one hour if we are in daylight savings
  if (tz.IsDaylightSavingTime(DateTime.Now))
  {
      offset++;
  }

现在,我可以在将对象发送到浏览器之前修复对象中的时间字段。

我真正的问题是,序列化器如何知道 7 小时?

http 请求不包含任何时间信息。

如果我想要数据库中存储的确切时间,我是否要求太多?

Update:

举个例子,数据库中的日期是:2009-Oct-15 22:00

没有附加时区信息。

当我在我的开发机器上调用 WebMethod 时,客户端和服务器 显然是在同一时区,来自服务器的 JSON 是:

{"d":{"TheDate":"\/Date(1255662000000)\/"}}

来自德国远程服务器的 JSON 是:

{"d":{"TheDate":"\/Date(1255636800000)\/"}}

在 Firebug 中可以看到 JSON 中有 7 小时的差异。在这 目前还没有涉及 JavaScript。

我的一个想法是 asp.net 将 TimeZone 附加到会话,但情况似乎并非如此。


为了回答 OP 的问题,时区信息在转换为 JSON /Date()/ 格式时是隐式的,因为它是相对于 UTC 的。例如,在我位于纽约的服务器上,如果我返回 DateTime.Parse("1/1/1970"),它会返回 /Date(18000000)/,或者 5 小时(我们现在处于 DST),这是自 1970 年 1 月 1 日以来的秒数UTC,因为转换表示“嘿,纽约是 1/1/1970 00:00:00,所以格林威治的时间一定是 1/1/70 05:00:00。”

现在,如果加利福尼亚州的客户收到此日期表示法,并简单地实例化一个以毫秒为单位的 JavaScript 日期(例如 new Date(18000000)),浏览器会说:“嘿,这是一个日期对象,我知道它是相对于UTC,我知道我距离格林威治有 8 小时路程,所以它一定是 1969 年 12 月 31 日 21:00:00。”

因此,这是一种非常聪明的处理时间的方法,因此它在所有时区都是“正确的”,并且所有本地化都由用户的浏览器处理。不幸的是,我们经常只处理一个原始日期,我们不想与时区相关(例如,生日)。如果我们需要保持日期相同,我知道有两种方法。

第一个,正如您上面所做的那样,是调整时间(尽管我认为如果您希望它在任何时区工作,您也需要在浏览器上执行此操作)。

另一种方法是将其作为已格式化的字符串返回。这是我通常采用的方法,但我通常与美国客户合作(例如,我可以返回 MM/DD/YYYY,并且他们不会因为我是美国人而生我的气)。

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

.net JSON序列化器将本地客户端时间返回给浏览器? 的相关文章

  • 回发后保持网格视图中 div 的滚动条位置

    我在 web config 中使用了以下代码 以便在服务器回发后保持滚动条位置
  • ASP.NET 成员资格 HashAlgorithmType 默认为 HMACSHA256,那么密码是哈希键控的吗?

    我有一个 ASP NET 4 5 Web 应用程序 它使用SqlMembershipProvider 在开发过程中 有人把passwordFormat Clear 在配置中导致密码以明文形式保存 我想删除它并启用密码散列 但我想确保散列不是
  • 在类库项目中使用资源.resx文件

    我在类库项目中使用了资源文件 resx 文件来存储一些错误消息 当我将 resx 文件的 构建操作 设置为 嵌入资源 并部署时 它工作正常 但我想将资源文件与dll分开 因为将来我可能需要更改resx文件中的错误消息 而无需重新编译类库项目
  • 将 JSON 反序列化为自定义列表

    我有这个 json var x 99 abc 2dp GroupNum 0 Total 4 1 7 x date 60 x 1dp GroupNum 1 存在以下规则 让i参考内部列表索引 x i 0 必填项 始终为整数 x i 1 必填项
  • EditorFor 的最小值和最大值

    我一直在尝试这段代码来设置我的最小值和最大值EditorFor
  • 如何在asp.net中按下按钮后刷新Gridview

    我正在尝试制作一个简单的图书馆数据库 我在网格视图中列出搜索结果 然后有一个文本框和一个按钮 用户输入 isbn 并单击贷款按钮 然后 如果有足够数量的物品 itemNumber gt 0 则由用户借出 这是用户界面的屏幕截图 我的问题是
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 本地权威声明和外部提供商声明的混淆

    我正在创建一个简单的 WebApi 它允许用户与 Facebook 连接 当我从 facebook 获取 accessToken 时 我调用 RegisterExternal 创建 Asp Net Identity 记录并存储令牌中的声明
  • 使垂直网格线出现在跨区表格单元格的顶部

    我正在开发一个 ASP Net 项目 我有一个
  • Jackson:使用点表示法将 JSON 属性转换为嵌套对象

    我有一个像这样的 JSON id 1 name Jack parent id 2 注意 parent id 属性上的点 是否可以将这些 JSON 映射到以下类 class Child private int id private Strin
  • 使用 jq 过滤空值和/或 null 值

    我有一个包含 jsonlines 的文件 想找到空值 name Color TV price 1200 available name DVD player price 200 color null 并希望输出空和 或空值及其键 availa
  • Gridview rowdatabound访问数据项vb

    我正在尝试将 ImageUrl 指向 GridView 中模板字段中的图像 但不断收到错误 你调用的对象是空的 在这一行 Dim imagePath As String rowView image path 我以前从未在 GridView
  • 删除具有多个主键的 Datalist 行

    我有一个带有 OnDeleteCommand Delete Command 的数据列表 我想要删除具有多个主键的记录 但我不知道如何从 Delete Command 事件访问它 如果我使用 DataKeyField 我只能使用一个键 有什么
  • 绑定 WebForms TextBox 上的千位分隔符的逗号

    我正在尝试如下格式化数据绑定值 但我不断得到一个空格作为千 位分隔符 即显示的文本始终是 12 340 00 而它应该是 12 340 00 我缺少什么
  • AWS Lambda - Nodejs 函数不会返回数据

    我是 NodeJS 函数调用的新手 我已经在屏幕上敲了几个小时了 我所有的谷歌搜索都没有帮助 所以我有一个 AWS Lambda 函数 它接收一个带有单个 ID 号的 JSON 对象 该 ID 号将被传递并最终作为 myid 发送到 get
  • json_decode 到自定义类

    是否可以将 json 字符串解码为 stdClass 以外的对象 不是自动的 但你可以按照老式的路线来做 data json decode json true class new Whatever foreach data as key g
  • ASP.NET 验证控件和 Javascript 确认框

    我有一个使用 NET 服务器端输入验证控件的页面 此页面还有一个 javascript 确认框 在提交表单时会触发该确认框 当前 当选择 提交 按钮时 会出现 javascript 确认框 一旦确认 就会触发 ASP NET 服务器端验证控
  • 解析 JWT 令牌以仅获取有效负载内容,无需 C# 或 Blazor 中的外部库

    我正在使用 Blazor 编写可以访问 JWT 的客户端应用程序 我想知道一种简单的方法来读取令牌有效负载内容而不添加额外的依赖项 因为我不需要其他信息 也不需要验证令牌 我认为解析有效负载内容应该足够简单 只需将其写入方法即可 JwtTo
  • 访问 ascx 文件中的母版页控件

    我有一个母版页文件 其中包含 2 个面板控件中的 2 个菜单 我还使用控件来检查用户是否登录并获取用户类型 根据我想要显示 隐藏面板的类型 控件本身不在母版页中引用 而是通过 CMS 系统动态引用 我想在用户控件中使用findcontrol
  • eventSources 到事件 Json,完整日历

    我正在尝试从 eventSources 获取 json 调用到我的事件 我在 eventSources 中返回的 json 是 title Title Test start 1305841052 当我将此字符串传递到事件中时 它会正确显示日

随机推荐