0

我在将此日期格式转换为另一种格式时遇到问题。我希望这里的人能够帮助我。

这是我的代码:

string fromFormat = "ddd, dd MM yyyy HH:mm:ss zzz"; 
string toFormat = "yyyy-MM-dd";

DateTime newDate = DateTime.ParseExact("Mon, 25 03 2013 00:00:00 GMT", fromFormat, null);

Console.WriteLine(newDate.ToString(toFormat));

- - - -编辑 - - - -

22通过将日期从更改为 ,我能够摆脱我的错误25。我的新问题是试图让时区从 GMT 转换为 EST。有人有什么想法吗?

-------编辑#2-------

这是我当前的代码。我仍然遇到时区转换问题。

var date = "Mon, 25 03 2013 00:00:00 GMT";

// Cuts off "GMT" portion of string
string newdate = date.Substring(0, 24);

// Switches the output of date
string fromFormat = "ddd, dd MM yyyy HH:mm:ss";
string toFormat = "yyyy-MM-dd";

DateTime newDate = DateTime.ParseExact(newdate, fromFormat, null);
string finaldate = newDate.ToString(toFormat);

// Output final date
Console.WriteLine(finaldate);

-------编辑#3-------

编码:

var input = "Mon, 25 03 2013 00:00:00 GMT";
var inner = input.Substring(0, 24);
var format = "ddd, dd MM yyyy HH:mm:ss";
var zoneId = "Eastern Standard Time";

var parsed = DateTime.ParseExact(inner, format, CultureInfo.InvariantCulture);

var utcDateTime = DateTime.SpecifyKind(parsed, DateTimeKind.Utc);
var eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(utcDateTime, zoneId);


Console.WriteLine(eastern);

错误:

Unhandled Exception: System.TimeZoneNotFoundException: Exception of type
   'System.TimeZoneNotFoundException' was thrown.
at System.TimeZoneInfo.FindSystemTimeZoneByFileName (System.String id, System.String
   filepath) [0x00000] in :0 
at System.TimeZoneInfo.FindSystemTimeZoneById (System.String id) [0x00000] in :0 
at System.TimeZoneInfo.ConvertTimeBySystemTimeZoneId (DateTime dateTime, System.String 
   destinationTimeZoneId) [0x00000] in :0 
at Program.Main () [0x00000] in :0 

任何帮助将非常感激!谢谢!

--------最终编辑-----

这就是最终改变时区并转换为我需要的格式的原因。特别感谢@MattJohnson 的所有帮助!

// Cuts off 'GMT' portion of string
var newdate = date.Substring(0, 24);

var fromFormat = "ddd, dd MM yyyy HH:mm:ss";
var toFormat = "yyyy-MM-dd";
var zoneId = "Eastern Standard Time";


var parsed = DateTime.ParseExact(newdate, fromFormat, CultureInfo.InvariantCulture);

// Specifies UTC time and converts it to EST timezone
var utcDateTime = DateTime.SpecifyKind(parsed, DateTimeKind.Utc);
var eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(utcDateTime, zoneId);

// Converts date to final format needed
var finaldate = eastern.ToString(toFormat);
4

7 回答 7

5
string fromFormat = "ddd, dd MM yyyy HH:mm:ss zzz"; 

错误是你的zzz,它需要timezone 的数字表示,而不是 timezone 的缩写。

所以一个可接受的版本是

DateTime newDate = DateTime.ParseExact("Mon, 22 03 2013 00:00:00 +0:00", fromFormat, null);

但这会引发不同的 FormatExecption 消息“字符串未被识别为有效的日期时间,因为星期几不正确。” 如果您进行周一到周五的更正,则解析有效

DateTime newDate = DateTime.ParseExact("Fri, 22 03 2013 00:00:00 +0:00", fromFormat, null);

我认为没有格式说明符可以采用时区的文本缩写版本。

于 2013-07-09T19:19:05.703 回答
2

正如其他人指出的那样,您拥有的输入值是自不一致的。它将 2013 年 3 月 22 日称为星期一,而实际上它是星期五。因此,您应该返回源数据并找出发生这种情况的原因。相信大家都听说过“垃圾进,垃圾出”这句话。

如果您确定要忽略星期几,并且确定时区始终为 GMT,那么您可以这样做:

var input = "Mon, 22 03 2013 00:00:00 GMT";
var inner = input.Substring(5, 19);
var format = "dd MM yyyy HH:mm:ss";
var parsed = DateTime.ParseExact(inner, format, CultureInfo.InvariantCulture);
var utcDateTime = DateTime.SpecifyKind(parsed, DateTimeKind.Utc);

请注意,我将类型明确设置为 UTC,因为您引入了 GMT 值。GMT 和 UTC 在所有实际用途中都是相同的。

如果可能会传递其他时区值,那么请提供不同可能输入的样本,也许我们可以找到一种方法来适应它。

顺便说一句- 这个字符串看起来非常类似于RFC822/RFC1123 格式的日期,除了您将月份作为数字而不是三个字母的缩写之一传递。你是故意这样做的吗?如果是这样,您已经破坏了这种格式的规范。如果您的意图是从数据中删除潜在的可本地化字符串,那么请使用已经为此设计的格式,例如ISO8601 / RFC3339

时区

您说您想转换为 EST,您可能是指“美国东部时间”,它在 EST 和 EDT 之间交替进行夏令时。尽管如此,Windows 时区数据库还是使用“东部标准时间”的 id 来指代这两个值 - 所以尽量不要在这一点上感到困惑。

一旦你有了日期,就像我上面展示DateTimeUtc那样,你可以使用以下方法将其转换为东部时间:

var zoneId = "Eastern Standard Time"; // don't get confused here! :)
var eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(utcDateTime, zoneId);

小心你用这个值做什么。如果您将其显示给用户,那么您就可以了。只需这样做:

var s = eastern.ToString("g"); // or whatever format you want.

但是,如果您对此进行数学运算,或将其存储为记录的事件时间,则可能会在结果中引入错误。这是由于夏令时转换。避免这种情况的一种方法是改用DateTimeOffset类型:

var utcDateTimeOffset = new DateTimeOffset(utcDateTime, TimeSpan.Zero);
var eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(utcDateTimeOffset, zoneId);

现在,当您使用这些值时,偏移量会捕获任何歧义。

如果这让您感到非常困惑,请不要担心 - 您并不孤单。您可能想尝试改用Noda Time。它会防止你在脚上开枪。

于 2013-07-09T19:50:27.273 回答
1

要查看有什么问题,请DateTime使用您的 fromString 打印:

DateTime dt = new DateTime(2013, 3, 22);
string s = dt.ToString(fromFormat);

你会看到输出是:

Fri, 22 03 2013 00:00:00 -04:00

所以这就是它所期望的格式。

您也许可以从本文中获得一些关于缩写的帮助。

于 2013-07-09T19:20:48.407 回答
0

22 03 2013 00:00:00 GMT 不是星期一而是星期五

尝试

            string fromFormat = "ddd, dd MM yyyy HH:mm:ss zzz";
            string toFormat = "yyyy-MM-dd";

            Console.WriteLine(DateTime.ParseExact("Fri, 22 03 2013 00:00:00 +00:00", fromFormat,
                             CultureInfo.InvariantCulture).ToString(toFormat));
于 2013-07-09T19:15:32.720 回答
0

有两个问题:

1) 选择的日期是星期五而不是星期一

2) 'zzz' 想要正负 0:00

因此,要使其正常工作将是:

string fromFormat = "ddd, dd MM yyyy HH:mm:ss zzz";
string toFormat = "yyyy-MM-dd";

DateTime newDate = DateTime.ParseExact("Fri, 22 03 2013 00:00:00 +0:00", fromFormat, null);

Console.WriteLine(newDate.ToString(toFormat));
于 2013-07-09T19:21:19.777 回答
0

没有简单的内置方法可以将时区缩写转换为偏移量或专有名称。这将在此主题中讨论:

时区缩写

您要么需要创建要使用的缩写表,映射到偏移量或专有名称,要么需要更改传入日期/时间字符串的格式以使用偏移量。

于 2013-07-09T19:21:25.320 回答
0
string fromFormat = "ddd, dd MM yyyy HH:mm:ss zzz"; 
string toFormat = "yyyy-MM-dd";

DateTime newDate = DateTime.ParseExact("Mon, 22 03 2013 00:00:00 +00:00", fromFormat, null);

Console.WriteLine(newDate.ToString(toFormat));
于 2013-07-09T19:22:42.007 回答