【问题标题】:C# TryParseExact CultureInfo.InvariantCulture Changing behavior when culture changeC# TryParseExact CultureInfo.InvariantCulture 文化改变时的行为改变
【发布时间】:2014-01-30 09:17:35
【问题描述】:

我正在尝试使用以下格式转换日期"d/MM/yyyy"

例子:

  • 2014 年 5 月 11 日
  • 2013 年 12 月 12 日
  • 31/01/2012

我正在使用 TryParseExact 方法:

private const string DateFormat = "d/MM/yyyy";
Culture = CultureInfo.InvariantCulture;
DateTime creationDateConverted;
DateTime.TryParseExact(creationDate, DateFormat, Culture, 
            DateTimeStyles.None, out creationDateConverted);

显示方式为

@Html.DisplayFor(m => object.date)

date having :  DisplayFormat( DataFormatString="{0:d/MM/yyyy}")

托管网站的服务器具有美国文化。

如果我使用 Web.config 将文化设置为 fr-FR,则效果很好。

但是,如果我不设置这种文化,它就不起作用,它会将其转换为 MM/dd/yyyy 格式,当然某些日期不会以该格式传递。

我不明白为什么文化会影响该方法,因为我提供了特定的格式和文化不变量。

我也尝试为该方法提供文化 fr-Fr 但没有运气

编辑:当我说失败时,我的意思是 TryParseExact 方法返回 false

【问题讨论】:

  • 请注意,您发布了解析代码,但询问为什么它是根据当前文化格式化而不显示格式化代码。
  • 如果不是绝对强制以任何一种本地化格式显示日期,最好以ISO 8601 格式显示日期:yyyy-MM-dd。
  • 这个解析代码没有问题,它是文化不变的。您如何询问结果,即查看 creationDateConverted 的设置?
  • 嗨 jodrell,实际上 TryParseExact 返回 false 并将 creationDateConverted 设置为 MinValue

标签: c# parsing date datetime


【解决方案1】:

DateTime 没有格式。 ToString 方法的输出取决于文化。

如果你想要一个特定的格式使用这个:

creationDateConverted.ToString("d/MM/yyyy");

【讨论】:

  • “如果您想要特定格式,请使用此”-您的示例并非明确,因为它使用了特定于文化的日期分隔符“/”。例如,在德国文化中,这将呈现为“.”。您应该添加一个参数 CultureInfo.InvariantCulture。
  • 您好,谢谢,我正在使用带有“d/MM/yyyy”的 DisplayFormat,所以我认为这不是问题
  • 您好,实际上问题是创建日期在服务器上具有不同的格式,因此您的解决方案是有效的。谢谢大家!
【解决方案2】:

您发布的解析代码不受任何外部文化设置的影响。

但是,当您询问 DateTime creationDateConverted 的值时,文化可能会影响所发生的事情。

【讨论】:

  • 嗨,谢谢,我已经输入了显示日期的代码,但是我的代码有问题,因为服务器无法转换某些日期(我添加了日志以检查它是否失败)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多