繁体   English   中英

日期格式C#

[英]Date Formatting C#

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

这是我的代码:

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

但这将引发不同的FormatExecption并显示消息“因为星期几不正确,所以无法将字符串识别为有效的DateTime”。 如果您进行周一至周五的更正,则解析工作正常

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

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

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

如果您确定要忽略星期几,并且确定时区始终为格林尼治标准时间,则可以执行以下操作:

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

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

如果这让您感到困惑,请不要担心-您并不孤单。 您可能想尝试使用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

因此这就是预期的格式。

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

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

有两个问题:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM