- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个使用 DateTime.UtcNow.ToString("s")
创建的 UTC 时间字符串(我从数据库中获取,因此我无法更改格式)。我想显示一些面向用户的东西,比如“10:00 AM”。我所在的地方(在英国),时钟最近向前走,下面的方法是一个小时:
var timenowstring = DateTime.UtcNow.ToString("s");
var dateutc = DateTime.Parse(timenowstring).ToShortTimeString();
var datelocal = DateTime.Parse(timenowstring).ToLocalTime().ToShortTimeString();
Console.WriteLine("Utc time string: " + dateutc);
Console.WriteLine("Local time string: " + datelocal);
两者都打印“9:02 AM”,而实际上是 10:02 AM。
这是它在 http://csharppad.com/ 上重现的截图:
我做错了什么?获取 DateTime 对象的最简单方法是什么,该对象将在我调用 .ToShortTimeString()
时返回正确的时间?
注意 the docs on ToLocalTime()说:
The conversion also takes into account the daylight saving time rule that applies to the time represented by the current DateTime object.
最佳答案
你说:
I have a a UTC time string (that I get from a database, so I can't change the format) that is created with
DateTime.UtcNow.ToString("s")
.
马上,你就有问题了。数据库中的日期(通常)不存储为字符串。它们存储在具有特定数据类型的字段中。在 SQL Server(例如)中,您可能正在使用 datetime
或 datetime2
字段。这些不是字符串。当您将它们检索到您的 .NET 代码中时,它们会直接转换为 DateTime
类型。如果您将其视为字符串,那就错了。
例如,您的数据访问代码可能会执行如下操作:
DateTime dt = Convert.ToDateTime(dataReader["myDateTimeField"].ToString());
这很常见,但完全错误。你应该这样做:
DateTime dt = (DateTime) dataReader["myDateTimeField"];
或者如果该字段可以为空:
DateTime? dt = dataReader["myDateTimeField"] as DateTime;
一旦您正确加载值而不是将其解析为字符串,其余的将正常工作。 DateTime
值的 Kind
属性将具有 DateTimeKind.Unspecified
,当您对其调用 ToLocalTime
时,它将假设您想要将未指定的值视为 UTC。 ( See the chart on MSDN .)
关于您发布的代码,虽然它有点困惑(不必要地遍历字符串),但它实际上可以正常工作 - 假设您在您的 时区运行它。在 ToLocalTime
方法中,“本地”表示代码恰好运行的机器的本地时区设置。 对于 csharppad.com,时区恰好是 UTC。它无法知道您想使用英格兰的时区规则。
如果您打算在服务器上运行您的代码,那么您根本不应该使用 ToLocalTime
- 因为服务器的时区可能无关紧要。相反,您可以使用 TimeZoneInfo
来转换时间:
// this uses the time zone for England
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
DateTime englandDatetime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, tz);
或者,您可以使用开源 Noda Time库,像这样:
DateTimeZone tz = DateTimeZoneProviders.Tzdb["Europe/London"];
DateTime englandDateTime = Instant.FromDateTimeUtc(utcDateTime)
.InZone(tz)
.ToDateTimeUnspecified();
关于c# - 为什么 DateTime.ToLocalTime() 不考虑夏令时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29557418/
我正在使用 c# mvc4。每个具有创建日期成员的实体我都在我的数据库中将 DateTime 保存为 DateTime.UtcNow,我有很多 View 来显示实体并在我的 html 中:@item.
documentation说... 您可以使用 ToLocalTime 方法恢复由 ToUniversalTime 或 FromFileTimeUtc 方法转换为 UTC 的本地日期和时间值。 然后(
使用 ToLocalTime() 时, 本地时间是如何确定的?本地时间是来自服务器还是客户端?我的假设是运行应用程序的服务器。 最佳答案 它是运行代码的计算机的本地时区。在 ASP.Net 应用程序中
这是一个简单的代码: System.DateTime dt = new DateTime(635267088000000000); Console.WriteLine(dt.ToLocalTime()
这是一个简单的代码: System.DateTime dt = new DateTime(635267088000000000); Console.WriteLine(dt.ToLocalTime()
我有一个带有 Kind = DateTimeKind.Utc 和时间跨度的 DateTime 实例。 var dt = DateTime.UtcNow; var ts = TimeSpan.FromD
我正在使用 MongoDB 数据库。我知道当您将 DateTime 插入 Mongo 时,它会将其转换为 UTC。但是我正在做一个单元测试,我的断言失败了。 [TestMethod] public v
本文整理了Java中java.time.ZonedDateTime.toLocalTime()方法的一些代码示例,展示了ZonedDateTime.toLocalTime()的具体用法。这些代码示例主
我在 GMT 时区的 Xamarin Studio (v4.0.12 - Mono 3.2.3) 中运行以下代码... var utcDateTime = new DateTime(1970, 07,
当我在计算机上(在模拟器上测试时)或手机上(直接在手机上测试时)更改时区时,DateTime.ToLocalTime() 不会返回更新的结果。 我注册并成功接收了 UIApplication.Noti
所以我不确定使用哪一个,因为我对两者的理解都有限。我遇到的问题是我想根据用户在他们的机器上将时钟设置为哪个时区来显示时间。例如,如果用户将他们的机器设置为 EST 但在加利福尼亚,我希望时间以 EST
我有一个使用 DateTime.UtcNow.ToString("s") 创建的 UTC 时间字符串(我从数据库中获取,因此我无法更改格式)。我想显示一些面向用户的东西,比如“10:00 AM”。我所
我正在使用 DateTime.ToLocalTime() 将日期从 UTC 时间转换为本地时间。我的时区是 GMT+1(贝尔格莱德、布达佩斯、卢比纳...),它在 Windows 设置 (XP) 中设
.NET 的文档 DateTime.ToLocalTime方法指出: On Windows XP systems, the ToLocalTime method recognizes only the
我在 .NET 的 DateTime 处理中遇到了可能是闰年的情况,特别是 ToLocalTime()。这是重现问题的一些代码(我在太平洋时区): DateTime dtStartLocal = Da
我的 Razor View 中有代码: @Model.DateUpdated.ToLocalTime().ToString("dd/MM/yyyy HH:mm:ss") 在我的模型中,属性如下: pu
DateTime.ToLocalTime 在 Linq to EF 中不受支持。 还有什么选择?我快没主意了。 最佳答案 不要在 Linq 查询中使用 .ToLocalTime(),而是在参数查询之外
Previously I was facing this issue and solved as described in the post . 目前在实现夏令时后,我发现如果我选择 DateTim
我有一个 .NET Core 2.0 应用程序,我需要将 UTC DateTime 转换为本地服务器时间。该软件可在 Linux (CentOS 7) 和 Windows 上运行。 在 Windows
有没有办法让 protobuf-net 以 UTC 自动编码 DateTime 值,但使用 ToLocalTime 解码? 我在不同时区的系统之间传递消息,并希望我的 DTO' 中的每个 DateTi
我是一名优秀的程序员,十分优秀!