将字符串转换为DateTime

如何将2009-05-08 14:40:52,531等字符串转换为DateTime

1745066 次浏览

试试这个

DateTime myDate = DateTime.Parse(dateString);

一个更好的方法是这样的:

DateTime myDate;
if (!DateTime.TryParse(dateString, out myDate))
{
// handle parse failure
}

你基本上有两个选项:DateTime.Parse()DateTime.ParseExact()

第一个在语法方面非常宽容,将解析许多不同格式的日期。它适合可能以不同格式出现的用户输入。

ParseExact将允许您指定用于解析的日期字符串的确切格式。如果您的字符串始终采用相同的格式,则最好使用此格式。这样,您可以轻松检测与预期数据的任何偏差。

您可以像这样解析用户输入:

DateTime enteredDate = DateTime.Parse(enteredString);

如果您有字符串的特定格式,则应使用其他方法:

DateTime loadedDate = DateTime.ParseExact(loadedString, "d", null);

"d"代表短日期模式(请参阅MSDN了解更多信息),null指定应使用当前区域性来解析字符串。

由于您正在处理基于24小时的时间,并且您有一个逗号分隔秒的部分,我建议您指定一个自定义格式:

DateTime myDate = DateTime.ParseExact("2009-05-08 14:40:52,531", "yyyy-MM-dd HH:mm:ss,fff",
System.Globalization.CultureInfo.InvariantCulture);
string input;
DateTime db;
Console.WriteLine("Enter Date in this Format(YYYY-MM-DD): ");
input = Console.ReadLine();
db = Convert.ToDateTime(input);


//////// this methods convert string value to datetime
///////// in order to print date


Console.WriteLine("{0}-{1}-{2}",db.Year,db.Month,db.Day);

试试下面的,其中strDate是'MM/dd/yyyy'格式的日期

var date = DateTime.Parse(strDate,new CultureInfo("en-US", true))

如果您不确定输入值,您也可以使用下面的DateTime. TryParseExact()。

DateTime outputDateTimeValue;
if (DateTime.TryParseExact("2009-05-08 14:40:52,531", "yyyy-MM-dd HH:mm:ss,fff", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out outputDateTimeValue))
{
return outputDateTimeValue;
}
else
{
// Handle the fact that parse did not succeed
}

似乎没有人实现扩展方法。在@cms的回答的帮助下:

工作和改进的完整源代码示例在这里:主旨链接

namespace ExtensionMethods {
using System;
using System.Globalization;


public static class DateTimeExtensions {
public static DateTime ToDateTime(this string s,
string format = "ddMMyyyy", string cultureString = "tr-TR") {
try {
var r = DateTime.ParseExact(
s: s,
format: format,
provider: CultureInfo.GetCultureInfo(cultureString));
return r;
} catch (FormatException) {
throw;
} catch (CultureNotFoundException) {
throw; // Given Culture is not supported culture
}
}


public static DateTime ToDateTime(this string s,
string format, CultureInfo culture) {
try {
var r = DateTime.ParseExact(s: s, format: format,
provider: culture);
return r;
} catch (FormatException) {
throw;
} catch (CultureNotFoundException) {
throw; // Given Culture is not supported culture
}


}


}
}


namespace SO {
using ExtensionMethods;
using System;
using System.Globalization;


class Program {
static void Main(string[] args) {
var mydate = "29021996";
var date = mydate.ToDateTime(format: "ddMMyyyy"); // {29.02.1996 00:00:00}


mydate = "2016 3";
date = mydate.ToDateTime("yyyy M"); // {01.03.2016 00:00:00}


mydate = "2016 12";
date = mydate.ToDateTime("yyyy d"); // {12.01.2016 00:00:00}


mydate = "2016/31/05 13:33";
date = mydate.ToDateTime("yyyy/d/M HH:mm"); // {31.05.2016 13:33:00}


mydate = "2016/31 Ocak";
date = mydate.ToDateTime("yyyy/d MMMM"); // {31.01.2016 00:00:00}


mydate = "2016/31 January";
date = mydate.ToDateTime("yyyy/d MMMM", cultureString: "en-US");
// {31.01.2016 00:00:00}


mydate = "11/شعبان/1437";
date = mydate.ToDateTime(
culture: CultureInfo.GetCultureInfo("ar-SA"),
format: "dd/MMMM/yyyy");
// Weird :) I supposed dd/yyyy/MMMM but that did not work !?$^&*


System.Diagnostics.Debug.Assert(
date.Equals(new DateTime(year: 2016, month: 5, day: 18)));
}
}
}

使用DateTime.Parse(string)

DateTime dateTime = DateTime.Parse(dateTimeStr);

将此代码放在静态类中> public static class ClassName{ }

public static DateTime ToDateTime(this string datetime, char dateSpliter = '-', char timeSpliter = ':', char millisecondSpliter = ',')
{
try
{
datetime = datetime.Trim();
datetime = datetime.Replace("  ", " ");
string[] body = datetime.Split(' ');
string[] date = body[0].Split(dateSpliter);
int year = date[0].ToInt();
int month = date[1].ToInt();
int day = date[2].ToInt();
int hour = 0, minute = 0, second = 0, millisecond = 0;
if (body.Length == 2)
{
string[] tpart = body[1].Split(millisecondSpliter);
string[] time = tpart[0].Split(timeSpliter);
hour = time[0].ToInt();
minute = time[1].ToInt();
if (time.Length == 3) second = time[2].ToInt();
if (tpart.Length == 2) millisecond = tpart[1].ToInt();
}
return new DateTime(year, month, day, hour, minute, second, millisecond);
}
catch
{
return new DateTime();
}
}

通过这种方式,您可以使用

string datetime = "2009-05-08 14:40:52,531";
DateTime dt0 = datetime.TToDateTime();


DateTime dt1 = "2009-05-08 14:40:52,531".ToDateTime();
DateTime dt5 = "2009-05-08".ToDateTime();
DateTime dt2 = "2009/05/08 14:40:52".ToDateTime('/');
DateTime dt3 = "2009/05/08 14.40".ToDateTime('/', '.');
DateTime dt4 = "2009-05-08 14:40-531".ToDateTime('-', ':', '-');

世界上不同的文化以不同的方式编写日期字符串。例如,在美国01/20/2008是2008年1月20日。在法国,这将抛出InvalidFormatException。这是因为法国将日期时间读取为日/月/年,而在美国是月/日/年。

因此,像20/01/2008这样的字符串将在法国解析到2008年1月20日,然后在美国抛出InvalidFormatException。

若要确定您当前的区域性设置,您可以使用System. Globalization. CulureInfo.流文化。

string dateTime = "01/08/2008 14:50:50.42";
DateTime dt = Convert.ToDateTime(dateTime);
Console.WriteLine("Year: {0}, Month: {1}, Day: {2}, Hour: {3}, Minute: {4}, Second: {5}, Millisecond: {6}",
dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, dt.Millisecond);

我尝试了各种方法。对我有效的是:

Convert.ToDateTime(data, CultureInfo.InvariantCulture);

data对我来说是这样的时间9/24/2017 9:31:34 AM

分析时间

语法:

DateTime.Parse(String value)
DateTime.Parse(String value, IFormatProvider provider)
DateTime.Parse(String value, IFormatProvider provider, DateTypeStyles styles)

示例:

string value = "1 January 2019";
CultureInfo provider = new CultureInfo("en-GB");
DateTime.Parse(value, provider, DateTimeStyles.NoCurrentDateDefault););
  • 值:日期和时间的字符串表示。
  • Provider:提供区域性特定信息的对象。
  • 样式:为某些日期和时间解析方法自定义字符串解析的格式设置选项。例如,AllowWhiteSpace是一个值,它有助于在解析时忽略字符串中存在的所有空格。

还值得记住的是,DateTime是一个在框架内部存储为数字的对象,Format仅适用于将其转换回字符串时。

  • 解析将字符串转换为内部数字类型。

  • 格式化将内部数值转换为可读的 字符串。

我最近遇到了一个问题,我试图将DateTime转换为传递给Linq,当将DateTime传递给Linq查询时,我当时没有意识到格式是无关紧要的。

DateTime SearchDate = DateTime.Parse(searchDate);
applicationsUsages = applicationsUsages.Where(x => DbFunctions.TruncateTime(x.dateApplicationSelected) == SearchDate.Date);

完整的DateTime文档

String now = DateTime.Now.ToString("YYYY-MM-DD HH:MI:SS");//make it datetime
DateTime.Parse(now);

这个给你

2019-08-17 11:14:49.000

你想快点吗?

假设你有一个格式为yyMMdd的约会。

我发现转换它的最快方法是:

var d = new DateTime(
(s[0] - '0') * 10 + s[1] - '0' + 2000,
(s[2] - '0') * 10 + s[3] - '0',
(s[4] - '0') * 10 + s[5] - '0')

只需根据您选择的日期格式选择索引。如果您需要速度,可能您不介意函数的“非泛型”方式。

这种方法需要大约10%的时间:

var d = DateTime.ParseExact(s, "yyMMdd", System.Globalization.CultureInfo.InvariantCulture);

我找到了一种优雅的方式:

Convert.ChangeType("2020-12-31", typeof(DateTime));


Convert.ChangeType("2020/12/31", typeof(DateTime));


Convert.ChangeType("2020-01-01 16:00:30", typeof(DateTime));


Convert.ChangeType("2020/12/31 16:00:30", typeof(DateTime), System.Globalization.CultureInfo.GetCultureInfo("en-GB"));


Convert.ChangeType("11/شعبان/1437", typeof(DateTime), System.Globalization.CultureInfo.GetCultureInfo("ar-SA"));


Convert.ChangeType("2020-02-11T16:54:51.466+03:00", typeof(DateTime)); // format: "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz"

这对我有效:

CultureInfo provider = CultureInfo.InvariantCulture;
DateTime dt = DateTime.ParseExact("2009-05-08 14:40:52,531","yyyy-MM-dd HH:mm:ss,fff", provider);