如何获取javascript new Date()的结果。getTimezoneOffset()传输到C#后端?

如何获取javascript new Date()的结果。getTimezoneOffset()传输到C#后端?,javascript,c#,jquery,timezone-offset,Javascript,C#,Jquery,Timezone Offset,请参阅标题:对于我正在研究的解决方案,我需要获取当前时区偏移量(从客户端,运行javascript/jQuery)并在后端C#代码中使用它。 这个问题与所问的问题非常相似,但也有一些不同之处——主要的一点是我非常确信客户端计算机上的时间不会被篡改。所以new Date().getTimezoneOffset()就可以了 我无法在提交表单时读取值,因为用户没有在表单中工作:用户登录后,屏幕上可见的项目中有一个包含用户或其他用户输入的数据的表。此数据包含必须根据客户时区进行调整的UTC日期时间。C#

请参阅标题:对于我正在研究的解决方案,我需要获取当前时区偏移量(从客户端,运行javascript/jQuery)并在后端C#代码中使用它。 这个问题与所问的问题非常相似,但也有一些不同之处——主要的一点是我非常确信客户端计算机上的时间不会被篡改。所以new Date().getTimezoneOffset()就可以了

我无法在提交表单时读取值,因为用户没有在表单中工作:用户登录后,屏幕上可见的项目中有一个包含用户或其他用户输入的数据的表。此数据包含必须根据客户时区进行调整的UTC日期时间。C#代码负责检索和格式化数据——因此我的问题是

只需将值存储在某个地方,以便C#在必要时读取即可。但我不认为这也能做到。这里的方法是什么


提前谢谢

您建议的方法存在缺陷,因为与客户端浏览器的当前偏移量仅适用于当前日期和时间。实际上,时区偏移量在给定时区内随时间而变化。您不能仅从一个时间点获取单个偏移量,然后期望使用它将其他日期和时间转换为同一时区。相反,您需要使用标识时区的字符串,而不是该时区的偏移量

以美国东部时区为例。一年中的部分时间,它使用UTC-5,我们称之为东部标准时间(EST)。在一年的另一部分,它使用UTC-4,我们称之为东部夏时制(EDT)。该时区由IANA时区ID“America/New_York”(美国/纽约)或Windows时区ID“Eastern Standard time”(东部标准时间)标识(尽管其措辞涵盖整个时区,包括东部标准时间和东部标准时间)

因此,将此问题分解为几个步骤:

  • 在JavaScript中,识别用户的IANA时区(
    America/NewYork
    ):

    • 如果您的目标是现代web浏览器,则可以调用此函数:

      Intl.DateTimeFormat().resolvedOptions().timeZone
      
    • 如果您需要支持较旧的web浏览器,您可以使用,或
      moment.tz.guess()
      from

  • 通过您喜欢的任何机制(表单post、XHR、fetch等)将该字符串发送到web服务器

  • 在.NET代码中,接收该字符串并使用它引用时区并进行转换。您有两个选择:

    • 您可以使用,将IANA时区ID传递给
      DateTimeZoneProviders.Tzdb
      ,如主页上的示例所示

    • 您可以使用.NET的内置
      TimeZoneInfo
      对象。如果您在非Windows系统(Linux、OSX等)上运行.NET Core,只需将IANA时区ID传递给
      TimeZoneInfo.FindSystemTimeZoneById
      。如果您在Windows上,则需要首先将其转换为Windows时区ID(
      “东部标准时间”
      )。您可以使用我的库中的
      TZConvert.GetTimeZoneInfo

  • 一旦您拥有来自Noda Time的
    DateTimeZone
    TimeZoneInfo
    对象,您就可以使用其上的方法将UTC值转换为该时区的本地时间值。其中每一项都将为转换的时间点应用正确的偏移


  • 我还要说,许多应用程序只是要求用户从下拉列表中选择时区,并将其保存在用户配置文件中。只要您存储的是时区标识符字符串而不仅仅是数字偏移量,这种方法就完全可以替代上面的步骤1和步骤2。

    您建议的方法存在缺陷,因为客户端浏览器的当前偏移量只适用于当前日期和时间。实际上,时区偏移量在给定时区内随时间而变化。您不能仅从一个时间点获取单个偏移量,然后期望使用它将其他日期和时间转换为同一时区。相反,您需要使用标识时区的字符串,而不是该时区的偏移量

    以美国东部时区为例。一年中的部分时间,它使用UTC-5,我们称之为东部标准时间(EST)。在一年的另一部分,它使用UTC-4,我们称之为东部夏时制(EDT)。该时区由IANA时区ID“America/New_York”(美国/纽约)或Windows时区ID“Eastern Standard time”(东部标准时间)标识(尽管其措辞涵盖整个时区,包括东部标准时间和东部标准时间)

    因此,将此问题分解为几个步骤:

  • 在JavaScript中,识别用户的IANA时区(
    America/NewYork
    ):

    • 如果您的目标是现代web浏览器,则可以调用此函数:

      Intl.DateTimeFormat().resolvedOptions().timeZone
      
    • 如果您需要支持较旧的web浏览器,您可以使用,或
      moment.tz.guess()
      from

  • 通过您喜欢的任何机制(表单post、XHR、fetch等)将该字符串发送到web服务器

  • 在.NET代码中,接收该字符串并使用它引用时区并进行转换。您有两个选择:

    • 您可以使用,将IANA时区ID传递给
      DateTimeZoneProviders.Tzdb
      ,如主页上的示例所示

    • 您可以使用.NET的内置
      TimeZoneInfo
      对象。如果您在非Windows系统(Linux、OSX等)上运行.NET Core,只需将IANA时区ID传递给
      TimeZoneInfo.FindSystemTimeZoneById
      。如果您使用的是Windows,则需要首先将其转换为