当前位置: 首页 > 知识库问答 >
问题:

C#使用specifyKind时出现时区问题

苍温文
2023-03-14

我在使用SpecifyKind时遇到问题。我发现,如果我将字符串(“O”)应用于DateTime.Now或new DateTime(),则会使spantime不同。我不知道这是怎么可能的。我尝试将这些日期时间保存为数据库中的Utc,但由于跨度不同,时间将不正确。
我就是这样做的:

var now = DateTime.Now;
                    var nowst = now.ToString("O", CultureInfo.InvariantCulture);
 var dattt = new DateTime(2020,07,20,09,44,09, DateTimeKind.Local);
                var datttst = dattt.ToString("O", CultureInfo.InvariantCulture);

现在:2021-12-08 13:40:35现在:2021-12-08T13:40:35.1159209 01:00日期:2020-07-20 09:44:09日期:2020-07-20T09:44:09.0000000 02:00”

共有1个答案

茹康裕
2023-03-14

当保存到数据库时,您希望保存UTC日期时间,以避免您已经提到的时间差,但是在C#中更好的方法是使用UtcNow,“O”值只是为了获得的ISO-8601表示形式的值。如果您的时间已经在UTC,您将无法将GMT添加到ISO-8601字符串中。

var utcNow = DateTime.UtcNow;
var utcNowO = utcNow.ToString("O", CultureInfo.InvariantCulture);
Console.WriteLine($"DateTime UtcNow: {utcNow} =>ISO-8601 of it: {utcNowO}");

至于为什么你的问题中的值的差异,它是夏令时,如果你选择UtcNow,你可以完全忽略它,并将值保存到数据库。当从数据库中读取时,您可以再次将其转换为本地时间,这将考虑到本地时区的格林尼治标准时间。
至于夏令时-这不能立即考虑,因为这些可以是仲裁决定由政府制定。在以色列——不到一个月前,政府通过了一项决定,将时钟设置为格林尼治标准时间3以适应日光,直到多年前一直是格林尼治标准时间2...你将来执行的代码不会知道这样的决定发生在过去只是几个月的开箱即用。如果您希望您的代码“知道”将来您应该用时间差而不是UTC日期时间来保存本地时间。

 类似资料:
  • 我有一个数十万对象的列表。当每一个运行时,它都会根据给定的值执行一个可能很长的计算。正因为如此,我希望异步运行每个任务(最好是通过使用某种执行器),并在30秒后检索每次计算的结果,取消那些没有及时完成的结果。(所得值在其他地方使用。) 到目前为止,我就是这样实现它的: ArrayList存储每个要执行的,然后将其发送到ExecutorService以运行所有任务。我遇到的问题是,任务似乎是同步启动

  • 问题内容: 我在应用程序中使用Gson,为此,我使用了一些名称与使用Json相同的类。我的应用程序运行良好,但是在编写proguard时,应用程序崩溃了,我猜有些类正在缩小。我的错误是: java.lang.ClassCastException:com.google.gson.internal.StringMap无法转换为com.sample.package.GsonClass 问题答案: 您需要

  • 我使用的是NetBeans 8.1,我有一个SpringBoot项目,它具有以下依赖项: 它们都是在依赖项中正确下载的。 该项目有3个java类和一个扩展JpaRepository的接口 在src/main/资源项下- 在html标签上,我有错误:本地名称为“xmlns: th不可序列化为XML 1.0的属性。如果我试图运行该项目并转到http://localhost:8080/页面,我有一个白标

  • 我已经实现了一个自定义的Keycloak UserStorageProvider SPI(以下是官方文档https://www.Keycloak.org/docs/latest/server_development/index.html#_user-storage-spi的第11点),它执行以下操作: 根据外部身份验证服务对用户(以前不存在于本地存储中)进行身份验证。 将(针对自定义服务成功进行身

  • 我正在编写一个UDAF,应用于Vector(spark.ml.linalg.Vector)类型的Spark数据帧列。我依赖spark.ml.linalg包,这样我就不必在数据帧和RDD之间来回穿梭。 在UDAF内部,我必须为输入、缓冲和输出模式指定数据类型: VectorUDT是我在spark.mllib.linalg.Vector中使用的:https://github . com/Apache/

  • 请问这是什么原因? 官方文档里的代码复制下来也是错误的