如何将字符串转换为日期时间
本文关键字:日期 时间 转换 字符串 | 更新日期: 2023-09-27 18:31:21
string value = "Sat Apr 28 2012 11:00:00 GMT-0400 (Eastern Daylight Time)"
我需要转换为日期时间
我尝试做:
DateTime datetime = DateTime.ParseExact(value, "MM/dd/yyyy hh:mm", null);
或
DateTime datetime2 = Convert.ToDateTime(value);
异常:字符串未被识别为有效的日期时间。
您指定的格式为"MM/dd/yyyy hh:mm",但您的字符串甚至不是该格式。
我怀疑你会在"GMT-0400(东部夏令时间)"部分遇到麻烦 - 其余部分的格式为"ddd MMM dd yyyy HH:mm:ss"或"ddd MMM d yyyy HH:mm:ss"如果月份中的日期并不总是两位数。
我建议您单独解析 UTC 的偏移量,并创建一个DateTimeOffset
- 将第一部分(格林威治标准时间之前)解析为未指定的DateTime
- 然后解析偏移量。编辑:您可以使用TimeSpan.ParseExact
解析偏移量,但我相信您需要自己处理符号 - 我看不到任何以这种方式解析负时间跨度的记录方式:(
编辑:请注意,我的Noda Time项目将允许您解析偏移部分,例如使用"'GMT'+HHmm"的模式 - 显然我们会处理LocalDateTime
部分 - 但您仍然需要将字符串的不同部分彼此分开。示例代码:
using System;
using System.Linq;
using System.Xml.Linq;
using NodaTime;
using NodaTime.Text;
public class Test
{
static void Main()
{
string text = "Sat Apr 28 2012 11:00:00 GMT-0400 (Eastern Daylight Time)";
ZonedDateTime parsed = Parse(text);
Console.WriteLine(parsed);
}
static readonly LocalDateTimePattern LocalPattern =
LocalDateTimePattern.CreateWithInvariantInfo("ddd MMM d yyyy HH:mm:ss");
// Note: Includes space before GMT for convenience later
static readonly OffsetPattern OffsetPattern =
OffsetPattern.CreateWithInvariantInfo("' GMT'+HHmm");
static ZonedDateTime Parse(string text)
{
int gmtIndex = text.IndexOf(" GMT");
int zoneIndex = text.IndexOf(" (");
// TODO: Validation that these aren't -1 :)
string localText = text.Substring(0, gmtIndex);
string offsetText = text.Substring(gmtIndex, zoneIndex - gmtIndex);
var localResult = LocalPattern.Parse(localText);
var offsetResult = OffsetPattern.Parse(offsetText);
// TODO: Validate that both are successful
var fixedZone = DateTimeZone.ForOffset(offsetResult.Value);
return localResult.Value.InZoneStrictly(fixedZone);
}
}
请注意,这将在固定的时区给出ZonedDateTime
- 而不是真正的东部时间。目前野田时间没有OffsetDateTime
,这很自然地适合这里......
尝试以下操作:
Convert.ToDateTime("Sat Apr 28 2012 11:00:00 GMT-0400 (Eastern Daylight Time)".Substring(4, 20))
您的字符串与您的格式不匹配。
在尝试转换该字符串之前,您需要稍微解析一下它。例如,可以分析"Apr 28 2012 11:00:00"。但是,您需要自己转换其余部分。
您可能需要考虑使用此处记录的DateTimeOffset
,因为它可以保持相对于 UTC 的时间,例如字符串。
发现这是文档,非常接近您拥有的内容
// Parse date and time with custom specifier.
dateString = "Sun 15 Jun 2008 8:30 AM -06:00";
format = "ddd dd MMM yyyy h:mm tt zzz";
try
{
result = DateTimeOffset.ParseExact(dateString, format, provider);
Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
}
catch (FormatException)
{
Console.WriteLine("{0} is not in the correct format.", dateString);
}
尝试ddd MMM d yyyy hh:mm:ss zzz
如果它不起作用,请尝试此操作
如果您查看自定义日期和时间格式字符串,您拥有的只是此格式的变体:
"ddd MMM dd yyyy h:mm:ss zzz"
只是里面有一些额外的部分:
"ddd MMM dd yyyy h:mm:ss GMTzzz (blah blah blah)"
如果你处理这些,你应该没问题:
value = value.Remove(value.IndexOf(" ("));
DateTime datetime = DateTime.ParseExact(value, "ddd MMM dd yyyy hh:mm:ss '"GMT'"zzz", null);