【问题标题】:Convert string to string(datetime) in EST在 EST 中将字符串转换为字符串(日期时间)
【发布时间】:2021-03-16 10:27:54
【问题描述】:

我在 “Mon, 20 Mar 2021 14:04:48 +0000”中有字符串 我想将其转换为 "20 Mar 2021 | 14:04 PM"

我想按原样转换字符串,但它在我的本地和服务器中的显示方式不同。

【问题讨论】:

  • 什么是string(datetime)
  • 也许this 回答了你的问题。
  • 你在哪里看到这个字符串?你确定它是一个字符串而不是一个日期时间吗? 它在我的本地和服务器中显示不同表明它是 DateTime 在您的服务器上以不同的格式显示
  • DateTime 和 DateTimeOffset 是二进制值,而不是字符串。它们没有格式,正是因为它们是二进制值。格式仅在向用户显示或序列化为文本、报告等时适用。
  • it was appearing differently in my local and server. 你们服务器的夏令时规则是什么?美国本周进入夏令时。英国于 3 月 28 日进入夏令时。使用字符串保存日期和时间,或假设偏移量不变是一个非常 坏主意。改变时间的不是服务器,而是错误处理日期的代码

标签: c# .net asp.net-mvc datetime-format


【解决方案1】:

首先20 Mar 2021星期六,而不是星期一,让我们更正一下。然后你可以ParseExact得到DateTime,最后在ToString()的帮助下以所需的格式表示:

  string source = "Sat, 20 Mar 2021 14:04:48 +0000";

  string result = DateTime
    .ParseExact(source, "ddd, dd MMM yyyy HH:mm:ss zzz", CultureInfo.InvariantCulture)
    .ToUniversalTime()
    .ToString("dd MMM yyyy' | 'HH:mm tt", CultureInfo.InvariantCulture);

注意事项:

  • 看来你想获得Universal(不是Local)时间,所以我加了ToUniversalTime()
  • 14:04 PM 对我来说看起来奇怪14:0402:04 PM 是更常见的格式);将hh 替换为HH 以拥有02:04 PM

【讨论】:

  • 3 月 20 日是儒略历中的星期五。
  • @Scroog1: 但仍然不是 星期一 ;)
  • 我确定它所在的某个地方有一个日历 :)
【解决方案2】:

如果您确实想处理时区信息,请使用Noda Time

如果那是您的确切文本格式,并且日期和时间是您想要的,您可以手动转换:

var input = "Mon, 20 Mar 2021 14:04:48 +0000";

var dateParts = input.Split(' ');
var timeParts  = dateParts[4].Split(':');
var amPm = int.Parse(timeParts[0]) < 12 ? "AM" : "PM";
var output = $"{dateParts[1]} {dateParts[2]} {dateParts[3]} | {timeParts[0]}:{timeParts[1]} {amPm}";

System.Console.WriteLine(output); // "20 Mar 2021 | 14:04 PM"

或者,如果您喜欢冒险,请使用regular expression

【讨论】:

  • 这保证了未来 6 个月的错误结果,因为各国已开始改用 DST。
  • 没有说明 +0000 是否会在字符串中或字符串之外发生变化。
  • 大概“2021 年 3 月 20 日星期一 14:04:48 +0100”仍希望是“2021 年 3 月 20 日 | 14:04 PM”,所以代码可以工作。
  • 为什么要做出这样的假设?当地时间是当地时间,如果还是冬天,就不是当地时间。如果该日期在英国是 29 Mar,则您需要使用 +1。在美国已经是夏天了
  • 我没有做任何假设。问题只是说将此字符串转换为另一个字符串。它没有说字符串是错误的,只是服务器正在将其更改为其他内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
相关资源
最近更新 更多