日期格式化C#

日期格式化C#,c#,datetime,C#,Datetime,我在将此日期格式转换为其他格式时遇到问题。我希望这里有人能帮我 这是我的密码: 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.ToStrin

我在将此日期格式转换为其他格式时遇到问题。我希望这里有人能帮我

这是我的密码:

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
来摆脱错误。我的新一期是试图让时区从格林尼治时间转换为东部时间。有人有什么想法吗

----编辑#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);

22 03 2013 00:00:00 GMT不是周一而是周五

试一试

错误是您的
zzz
,它不是时区的缩写

因此,可以接受的版本是

DateTime newDate = DateTime.ParseExact("Mon, 22 03 2013 00:00:00 +0:00", fromFormat, null);
但这将抛出一个不同的formatExecution,其中包含消息“字符串未被识别为有效的日期时间,因为星期几不正确。”如果您使解析工作正常

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

我认为没有一个格式说明符可以接受时区的文本缩写版本。

若要查看错误,请使用fromString打印一个
DateTime

DateTime dt = new DateTime(2013, 3, 22);
string s = dt.ToString(fromFormat);
您将看到输出是:

Fri, 22 03 2013 00:00:00 -04:00
这就是它所期望的格式

您可以从

获得有关缩写的帮助。有两个问题:

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年3月22日称为星期一,实际上是星期五。所以你应该回到你的源数据,找出为什么会发生这种情况。我相信你一定听说过“垃圾进来,垃圾出去”这句话

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));
如果确定要忽略星期几,并且确定时区始终为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在所有实际用途上都是相同的

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

顺便说一句,这个字符串看起来非常类似,只是您将月份作为数字传递,而不是三个字母缩写中的一个。你是故意这么做的吗?如果是这样,则表示您已违反此格式的规范。如果您打算从数据中删除可能可本地化的字符串,那么请使用已经为此设计的格式,例如/

时区 你说你想转换成东部时间,你可能指的是“美国东部时间”,在东部时间和东部时间之间交替使用夏令时。尽管如此,Windows时区数据库使用id“Eastern Standard Time”(东部标准时间)来引用这两个值,因此请不要在这一点上混淆

一旦您将日期设置为
Utc
类型的
DateTime
,如上所示,您可以通过以下方式将其转换为东部时间:

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);
现在,当您使用这些值时,任何歧义都会被偏移捕获


如果你觉得这很困惑,别担心,你并不孤单。您可能想尝试使用。它可以防止你射中自己的脚。

没有。即使我去掉代码的
zzz
GMT
部分,它仍然会抛出相同的错误。当我同时删除
ddd
zzz
部分时,错误将停止。2013年3月22日的确切解析是星期五-这就是引发FormatException的原因。如果您是从外部来源获取数据,则数据不正确。您误解了,因为您测试的日期不正确。2013-03-22不是星期一,而是星期五。如果
Mon
Tue
Wed
不可靠,您必须先从字符串中删除它,然后再尝试解析它并删除ddd部分。您最好从JavaScript中发送适当的ISO8601字符串(类似于
2013-22-03T00:00Z
)…哇,多好的评论啊!我肯定错过了昨天所有的其他帖子:)不过我有一些答案和问题要问你!首先,它总是
GMT
时间,只需将其转换为
EST
时间。如上所示,我是否需要转换为
UTC
以使其转到
EST
时间?或者我可以保持原样吗?另外,您上面显示的代码,是否可以解释夏令时?我知道你告诉过我不要困惑,但我的确:)对不起!GMT是UTC。您需要告诉它您有UTC,否则,
DateTime
到ET的转换将不正确。对于的
DateTimeOf,您可以跳过该选项
var s = eastern.ToString("g"); // or whatever format you want.
var utcDateTimeOffset = new DateTimeOffset(utcDateTime, TimeSpan.Zero);
var eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(utcDateTimeOffset, zoneId);