将日期从6/05/2020格式转换为dd/MM/YYYY格式。

8

我遇到一个小问题,尝试了很多方法都没有解决。我的页面上有一个文本框,我输入日期并希望以datetime对象的形式显示。

例如: 输入的日期为6 05 2020(dd/MM/yyyy)时,当我在访问它的时间对象时,应该保持相同的格式,但它被改变成了(6.05.2020ie: MM/dd/yyyy格式)。

希望我的描述有意义,我希望得到下面这样的结果...

DateTime dt = convert.ToDateTime(txtDate.Text);

dt应该是11/2/2010而不是2/11/2010。

@oded在使用以下代码后:

DateTime sDate, eDate = new DateTime(); 

//为了修改我们使用的日期。 DateTime.TryParseExact(txtFrom.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out sDate);

DateTime.TryParseExact(txtFrom.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out eDate); 

我收到的edate和sdate值是6 05 2020 12:00:00 AM,但实际上应该是6/05/2020。


我不确定你的意思。DateTime对象除了具有ToString()方法的实现之外,不应该有“格式”。您应该能够以任何您喜欢的方式显示它。 - kmkemp
为什么不使用AjaxControlToolkit中的CalenderExtender,其格式如下CalenderExtender1.Format = "dd.MM.yyy";?我认为直接输入日期是不安全的,因为用户可能会输入任何格式而不知道你的日期文本框是如何工作的。 - Bastardo
1
如果你得到了1/1/0001,那就意味着被解析的文本无效。我会简单地使用一个CalendarExtender,因为你想要做的事情需要太多的工作,而这并不值得。 - Security Hound
5个回答

11

DateTime 不以任何特定格式存储日期——它使用内部表示(确切地说不应该有所影响)。

将字符串解析为 DateTime 后,其中没有固有的格式。只有在你输出该值时才会有格式。在调试器中看到的只是使用系统设置进行字符串转换。

如果想要格式化 DateTime,请使用带有格式字符串的 ToString

dt.ToString("dd/MM/yyyy");

相反的情况也适用-如果您需要无歧义地解析字符串,请使用ParseExactTryParseExact(均为DateTime的静态成员):

DateTime dt;

if(DateTime.TryParseExact(txtDate.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture,
                           DateTimeStyles.None, out td))
{
  // Valid date used in `txtDate.Text`, use dt now.
}

阅读有关自定义标准日期和时间格式字符串的内容。


由于您使用了ToString,所以它再次成为字符串,但我不需要字符串,我需要DateTime对象中的数据。您能否提供一些代码片段,通过从文本框中选择值并将其格式修改为dd/MM/yyyy,然后将其放入DateTime对象中? - ankur
@ankur - DateTime 没有格式。你只能将其格式化为字符串。 - Oded
3
听起来这里更重要的是解析而不是格式化。"我的页面中有一个文本框,我在其中输入日期,我希望得到一个日期时间对象。"这是一个解析任务。 - Jon Skeet
为什么不使用一个 CalenderExtender,并设置其格式为 CalenderExtender1.Format = "dd.MM.yyy"; - Bastardo
@ankur - Oded 是正确的 - 在可能的情况下保持值为 DateTime 类型(不要在内部作为字符串传递),这样可以避免处理时区、格式等带来的许多麻烦。只有在将日期时间显示给人类时,例如在屏幕上、报告中等,才需要考虑格式。 - StuartLC
显示剩余6条评论

11

编辑:这个值:“11/2/2010”不符合“dd/MM/yyyy”格式。它匹配“d/M/yyyy”格式-对于“dd/MM/yyyy”,应该是“11/02/2010”。

这就是为什么TryParseExact失败的原因。您需要选择正确的格式模式。


DateTime没有格式。它只表示日期和时间(按照ISO日历,可能在不同的时区,但这是另一回事)。它就像一个int - 它不代表“十进制整数”或“十六进制整数” - 它只是一个特定范围内的整数。您可以将数字格式化为十进制或十六进制,但它本身没有格式。

看起来您应该使用ParseExact指定格式来转换文本框中读取的内容,或者更好地使用TryParseExact

// This is assuming you're absolutely sure of the format used. This is *not*
// necessarily the user's preferred format. You should think about where your
// data is coming from.
DateTime date;
if (DateTime.TryParseExact(text, "dd/MM/yyyy", CultureInfo.InvariantCulture,
                           DateTimeStyles.None, out date))
{
    // Okay, successful parse. We now have the date. Use it, avoiding formatting
    // it back to a string for as long as possible.
}

除了返回给用户时可能需要使用他们的文化设置之外,您应该将该值保留为DateTime以供所有目的使用。

特别是,如果要存储该值到数据库中,则不应将其转换为文本并包含在SQL语句中 - 这样会引发问题。相反,使用参数化SQL语句,并将其设置为参数值,仍然是DateTime


DateTime sDate, eDate = new DateTime(); //用于修改日期以便我们使用。DateTime.TryParseExact(txtFrom.Text,"dd/MM/yyyy",CultureInfo.InvariantCulture,DateTimeStyles.None,out sDate); DateTime.TryParseExact(txtFrom.Text,"dd/MM/yyyy",CultureInfo.InvariantCulture,DateTimeStyles.None,out eDate); 我得到的edate和sdate是1/1/0001 12:00:00 AM,而不是3/11/2011,我想你明白我的意思,输出不正确,这是我的问题所在。 - ankur
@ankur:你忽略了TryParseExact的返回值,这几乎肯定是false。这里的txtFrom.Text的值是多少?你谈论“那只是我的问题”,但我认为你仍然基本上没有理解DateTime没有格式这一点。你在调试器中看到的可能是一个格式化表示,但这与DateTime本身内部的值不同。 - Jon Skeet
@ankur:请看我回答的更新,位于顶部 - 如果您试图将“11/2/2010”解析为指定为“MM”格式(即恰好两个数字)的月份,则该解析确实会失败。 - Jon Skeet
谢谢您的指正,但问题仍然存在。我将解释并粘贴代码示例。我在sDate中输入了3/11/2011,在eDate中输入了25/6/2002,所以我得到的值是eDate = 6/25/2002(错误),sDate = 1/1/0001(错误)。我的代码如下: DateTime.TryParseExact(txtFrom.Text, "dd/M/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out sDate); DateTime.TryParseExact(txtTo.Text, "dd/M/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out eDate); - ankur
@ankur:不,'eDate' 是一个 DateTime 类型。它不是 2002 年 6 月 25 日,而是代表 2002 年 6 月 25 日的值。不要查看整个DateTime值的调试器表示以尝试确定字符串格式。那会让你感到困惑。使用 dt.Month 等方法来确定该值是什么。而且“3/11/2011”不适合“dd/M/yyyy”,因为你只给了一个 day 值。看起来你可能希望使用我在答案中提到的“d/M/yyyy”。 - Jon Skeet

2

用户遇到的问题并不理解,是用户可以输入任何日历格式,只有他检查过的格式才能被解析。在特定格式中解析后显示DateTime是微不足道的。 - Security Hound

-1
尝试使用适当的格式提供程序和 DateTime.Parse。在您的情况下,应该是:
IFormatProvider culture = new CultureInfo("de-DE", true);
DateTime.Parse(txtDate.Text, culture );

只有当输入与提供的文化匹配时,此方法才有效。对于任何其他模式,它都会失败。 - Security Hound
是的,那是正确的。至于他要求的给定格式,我向他展示了如何使用格式提供程序的示例。正如我在回答中所说,他必须使用适当的格式提供程序。我只是举了一个例子... - PVitt

-1

1
作者想要获取任何用户输入并将提供的格式转换为特定格式。这就是为什么有日历控件的原因。文本字段只会给他带来问题,因为有太多可能的格式需要检查。 - Security Hound
我的回答与如何输出DateTime有关,而不是如何读取它。他的问题并没有询问使用哪个控件的建议。我所知道的是,他被迫使用文本字段。 - kmkemp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接