ChatGPT解决这个技术问题 Extra ChatGPT

DateTime.TryParse 日期为 yyyy-dd-MM 格式的问题

我有以下字符串格式的日期 "2011-29-01 12:00 am" 。现在我正在尝试使用以下代码将其转换为日期时间格式:

DateTime.TryParse(dateTime, out dt); 

但我总是将 dt 设为 {1/1/0001 12:00:00 AM},你能告诉我为什么吗?以及如何将该字符串转换为日期。

编辑:我刚刚看到每个人都提到使用格式参数。我现在要提到我不能使用格式参数,因为我有一些设置来选择用户想要的自定义日期格式,并且基于该用户能够通过 jQuery datepicker 自动获取该格式的文本框中的日期。

顺便说一下,您可以通过检查 TryParse 的返回值来确定转换是否失败。即bool success = DateTime.TryParse(...);

B
BrokenGlass

这应该根据您的示例“2011-29-01 12:00 am”起作用

DateTime dt;
DateTime.TryParseExact(dateTime, 
                       "yyyy-dd-MM hh:mm tt", 
                       CultureInfo.InvariantCulture, 
                       DateTimeStyles.None, 
                       out dt);

打败我。如果您知道输入字符串的格式,您实际上应该始终使用 TryParseExact/ParseExact 方法。
好的,所以我的日期格式类似于示例中的日期格式,但是如果日期或月份值是单个数字,则 DateTime 解析器将返回一个错误,因为当只有一个数字时它会查找两个数字。在这种情况下你会建议什么?
要回答我自己的问题,在这种情况下,如果您在格式中使用单个字符,它适用于单字符日期和双字符日期。例如 d/m/yyyy 适用于 13/11/2012
@BrokenGlass 这对我不起作用你能帮我解决这个问题吗
@CiaranGallagher 只是一个小评论,您评论中的日期应该使用大 M (d/M/yyyy)
C
ChrisF

您需要使用 ParseExact method。这需要一个字符串作为它的第二个参数,它指定日期时间的格式,例如:

// Parse date and time with custom specifier.
dateString = "2011-29-01 12:00 am";
format = "yyyy-dd-MM h:mm tt";
try
{
   result = DateTime.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);
}

如果用户可以在 UI 中指定格式,那么您需要将其转换为可以传递给此方法的字符串。您可以通过允许用户直接输入格式字符串来做到这一点 - 尽管这意味着转换更有可能失败,因为他们将输入无效的格式字符串 - 或者有一个组合框为他们提供可能的选择,您为这些选项设置格式字符串。

如果输入可能不正确(例如用户输入),最好使用 TryParseExact 而不是使用异常来处理错误情况:

// Parse date and time with custom specifier.
dateString = "2011-29-01 12:00 am";
format = "yyyy-dd-MM h:mm tt";
DateTime result;
if (DateTime.TryParseExact(dateString, format, provider, DateTimeStyles.None, out result))
{
   Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
}
else
{
   Console.WriteLine("{0} is not in the correct format.", dateString);
}

更好的选择可能是向用户显示日期格式的选择,但使用 overload that takes an array of formats

// A list of possible American date formats - swap M and d for European formats
string[] formats= {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt", 
                   "MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss", 
                   "M/d/yyyy hh:mm tt", "M/d/yyyy hh tt", 
                   "M/d/yyyy h:mm", "M/d/yyyy h:mm", 
                   "MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm",
                   "MM/d/yyyy HH:mm:ss.ffffff" };
string dateString; // The string the date gets read into

try
{
    dateValue = DateTime.ParseExact(dateString, formats, 
                                    new CultureInfo("en-US"), 
                                    DateTimeStyles.None);
    Console.WriteLine("Converted '{0}' to {1}.", dateString, dateValue);
}
catch (FormatException)
{
    Console.WriteLine("Unable to convert '{0}' to a date.", dateString);
}                                               

如果您从配置文件或数据库中读取可能的格式,那么您可以在遇到人们想要输入日期的所有不同方式时添加这些格式。

这种方法的主要缺点是您仍然会有模棱两可的日期。这些格式是按顺序尝试的,所以无论它会在美国之前尝试欧洲格式(反之亦然),并涵盖日期小于 13 到欧洲格式日期的任何内容,即使用户认为他们正在输入美国格式化日期。


M
Marco Forberg

尝试使用安全的 TryParseExact 方法

DateTime temp;
string   date = "2011-29-01 12:00 am";

DateTime.TryParseExact(date, "yyyy-dd-MM hh:mm tt", CultureInfo.InvariantCulture, DateTimeStyles.None, out temp);

Ḟḹáḿíṅḡ Ⱬỏḿƀíé

来自 msdn 上的 DateTime

类型:System.DateTime% 此方法返回时,如果转换成功,则包含与 s 中包含的日期和时间等效的 DateTime 值,如果转换失败,则包含 MinValue。如果 s 参数为空、为空字符串 ("") 或不包含日期和时间的有效字符串表示形式,则转换失败。此参数未初始化传递。

请改用带有格式字符串 "yyyy-dd-MM hh:mm tt" 的 parseexact。


L
Lucas S.

这样可行:

DateTime dt = DateTime.ParseExact("2011-29-01 12:00 am", "yyyy-dd-MM hh:mm tt", System.Globalization.CultureInfo.InvariantCulture);

M
Mehul Mistri
DateTime dt = DateTime.ParseExact("11-22-2012 12:00 am", "MM-dd-yyyy hh:mm tt", System.Globalization.CultureInfo.InvariantCulture);

J
Jim Mischel

如果您让用户有机会更改日期/时间格式,那么您必须创建相应的格式字符串以用于解析。如果您知道可能的日期格式(即用户必须从列表中选择),那么这会容易得多,因为您可以在编译时创建这些格式字符串。

如果您让用户对日期/时间格式进行自由格式设计,那么您必须在运行时创建相应的 DateTime 格式字符串。


没错 jim 如果让用户对日期/时间格式进行自由格式设计,那么您将不得不在运行时创建相应的 DateTime 格式字符串。