日期格式C#

本文关键字:格式 日期 | 更新日期: 2023-09-27 18:21:46

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

这是我的代码:

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);

日期格式C#

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

错误是您的zzz,它需要时区的数字表示,而不是时区的缩写。

所以一个可以接受的版本是

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

但这将抛出一个不同的FormatExection,并显示消息"由于星期几不正确,字符串未被识别为有效的DateTime。"

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

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

正如其他人所指出的,您的输入值是自不一致的。它将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。

时区

你说你想转换为美国东部时间,你的意思可能是"美国东部时间",它在美国东部时间和美国东部时间之间交替表示夏令时。尽管如此,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"。它可以防止你朝自己的脚开枪。

要查看问题所在,请使用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));

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

时区缩写

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

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年3月22日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));