从字符串创建 DateTime 而不应用时区或夏令时

发布于 2024-11-09 05:48:39 字数 330 浏览 0 评论 0原文

如何从已针对 UTC 调整的字符串创建 DateTime 变量?我在设置为 BST (GMT+1) 的计算机上运行此程序。如果我运行以下代码行:

DateTime clientsideProfileSyncStamp = Convert.ToDateTime("20-May-2011 15:20:00");

然后在针对保存 (UTC) 值的数据库的测试中使用该值,那么看起来 Convert.ToDateTime() 实际上给我的 UTC 值是 14:20。我不希望它进行转换 - 我只是希望它接受我的 DateTime 字符串已经采用 UTC 格式。

谢谢。

How do I create a DateTime var from a string which is already adjusted for UTC? I am running this on a machine set to BST (GMT+1). If I run the following line of code:

DateTime clientsideProfileSyncStamp = Convert.ToDateTime("20-May-2011 15:20:00");

and then use the value in a test against a database holding (UTC) values then it would appear that the Convert.ToDateTime() is actually giving me a UTC value of 14:20. I don't want it to do the conversion - I just want it to accept that my DateTime string is already in UTC.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

乖不如嘢 2024-11-16 05:48:39

解析字符串,并指定当字符串中没有指定时区时应采用 UTC 时间:

DateTime clientsideProfileSyncStamp =
  DateTime.Parse(
    "20-May-2011 15:20:00",
    CultureInfo.CurrentCulture,
    DateTimeStyles.AssumeUniversal
  );

Parse the string, and specify that it should assume UTC time when there is no time zone specified in the string:

DateTime clientsideProfileSyncStamp =
  DateTime.Parse(
    "20-May-2011 15:20:00",
    CultureInfo.CurrentCulture,
    DateTimeStyles.AssumeUniversal
  );
等风来 2024-11-16 05:48:39

使用

DateTimeOffset.Parse

广告不足的 DateTimeOffset type 表示时间点,无论时区差异如何,因此应优先使用需要“时间戳”的 DateTime。

Use

DateTimeOffset.Parse

The under-advertised DateTimeOffset type represents a point in time regardless of timezone differences, and as such should be used in preference to DateTime where a 'timestamp' is required.

伴随着你 2024-11-16 05:48:39

@Guffa 的答案非常好,但我想添加一个额外的答案。
如果您的日期时间字符串看起来像这样“2017-11-27T05:30:00.000Z”,那么 AssumeUniversal 不起作用。
试试这个:

    DateTime.Parse("2017-11-27T05:30:00.000Z", null, System.Globalization.DateTimeStyles.AdjustToUniversal);

AssumeUniversal 和 AdjustToUniversal 之间有细微的差别。请阅读此处:AssumeUniversal 和 AdjustToUniversal 之间的区别

@Guffa's answer is very good but i will like to add an additional answer.
If your datetime string is looking like this "2017-11-27T05:30:00.000Z" then AssumeUniversal is not working.
Try this :

    DateTime.Parse("2017-11-27T05:30:00.000Z", null, System.Globalization.DateTimeStyles.AdjustToUniversal);

There is a slight difference between AssumeUniversal and AdjustToUniversal. Read here : Difference between AssumeUniversal and AdjustToUniversal

撩人痒 2024-11-16 05:48:39

Z 添加到日期时间字符串:

DateTime clientsideProfileSyncStamp = Convert.ToDateTime("20-May-2011 15:20:00Z");
Console.Write(clientsideProfileSyncStamp.ToUniversalTime()); // 20-May-2011 15:20:00

Add a Z to the DateTime string:

DateTime clientsideProfileSyncStamp = Convert.ToDateTime("20-May-2011 15:20:00Z");
Console.Write(clientsideProfileSyncStamp.ToUniversalTime()); // 20-May-2011 15:20:00
猫烠⑼条掵仅有一顆心 2024-11-16 05:48:39

不要忘记 TryParse 变体,它允许您处理解析错误而不发生异常。

DateTime clientsideProfileSyncStamp;
DateTime.TryParse(
    "20-May-2011 15:20:00",
    System.Globalization.CultureInfo.CurrentCulture,
    System.Globalization.DateTimeStyles.AssumeUniversal,
    out clientsideProfileSyncStamp
);

此外,如果您不使用 ParseExactTryParseExact ,它也会假设输出 KindLocal,因此您可能还想使用 ToUniversalTime()

clientsideProfileSyncStamp.ToUniversalTime();

Don't forget the TryParse variant which allows you to handle a parse error without an exception

DateTime clientsideProfileSyncStamp;
DateTime.TryParse(
    "20-May-2011 15:20:00",
    System.Globalization.CultureInfo.CurrentCulture,
    System.Globalization.DateTimeStyles.AssumeUniversal,
    out clientsideProfileSyncStamp
);

Also if you are not using ParseExact or TryParseExact it will assume the output Kind is Local so you may also want to use ToUniversalTime()

clientsideProfileSyncStamp.ToUniversalTime();
梦醒时光 2024-11-16 05:48:39

DateTime.Parse()DateTime.TryParse()

var clientsideProfileSyncStamp = DateTime.Parse("20-May-2011 15:20:00");

DateTime.Parse() or DateTime.TryParse()

var clientsideProfileSyncStamp = DateTime.Parse("20-May-2011 15:20:00");
淑女气质 2024-11-16 05:48:39

要创建独立于区域性的 DateTime,请使用:

DateTime.Parse("2022-02-15 09:30:47", CultureInfo.InvariantCulture)

然后日期始终与字符串中定义的完全相同。

To create culture independent DateTime use:

DateTime.Parse("2022-02-15 09:30:47", CultureInfo.InvariantCulture)

Then the date stays always exactly as defined in string.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文