【问题标题】:Prevent user system setting for time and date string processing防止用户系统设置时间和日期字符串处理
【发布时间】:2017-09-05 18:04:59
【问题描述】:

我正在尝试加载日期时间和时间字符串

DateTime strTime = DateTime.ParseExact(strTime.Trim(), "dd/MM/yyyy hh:mm:ss tt", CultureInfo.InvariantCulture); 

我有几个地方可以处理日期时间字符串,来自 dateTimePicker:

 UseDate = dateTimePicker1.Value.ToString("MMMM dd, yyyy - dddd");  

写入然后从文件中加载:

 dateTimePicker3.Value = DateTime.ParseExact(DB, "yyyy-MM-dd", CultureInfo.InvariantCulture);

它适用于英语,但不确定如何防止用户有不同的设置,如中文或俄语,在这种情况下我得到:

An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll

Additional information: String was not recognized as a valid DateTime.

我可以通过替换"/""." 来防止输入不同的标点符号,并从字符串中删除所有单词,但在这种情况下,我不确定如何找出正确的方法。

例如,在调试中,我看到strTime 带有俄语"апреля 10, 2017 - понедельник" 字符串,但是如何将其更改为正确的可读日期而没有文字。我不能用正则表达式处理它,因为结果我可以得到类似102017 或至少10.20.17 但不是10 April of 2017 必须是10.04.201710/04/201710-04-2017 甚至不同的订购4/10/2017

【问题讨论】:

标签: c# winforms date datetime time


【解决方案1】:

您无需执行任何字符串操作即可将string 解析为DateTime,只需正确的CultureInfo 和格式字符串即可。使用您的示例字符串,解析它的方式类似于:

string strTime = "апреля 10, 2017 - понедельник";
CultureInfo ci = new CultureInfo("ru-RU");
DateTime dateParsed = DateTime.ParseExact(strTime, "MMMM dd, yyyy - dddd", ci);

如您所见,使用适当的文化和格式字符串,日期可以正确解析。

顺便说一句,值得注意的是,使用ParseExact,您可以拥有任意数量的格式字符串,只需使用string[]

string[] formats = new string[] 
{
     "MMMM dd, yyyy - dddd", "dd/MM/yyyy", "MM-dd-yyyy"
};
DateTime dateParsed = DateTime.ParseExact(strTime, formats, ci);

【讨论】:

  • 所以他必须知道使用哪种文化信息。如果它混入他的输入怎么办?
  • 不,你不需要知道。由于 OP 使用的是 winforms,只要日期字符串具有适当的格式,只需使用 CurrentCulture 即可使 ParseExact 工作
  • 这使这个答案完整+1
  • @Pikoh 是的,这样我可以将其更改为不同的,但我正在尝试找到将任何不同文化输入更改为英语文化 yyyy-M-d 的方法
【解决方案2】:

您正在使用 DateTime.ParseExact,这意味着您提供的格式掩码应该与您作为要转换为日期时间的字符串传递的内容完全匹配。

如果对该字符串进行俄语转换(“апреля 10, 2017 - понедельник”),您应该提供带有适当 CultureInfo 的此类掩码

 "MMMM dd, yyyy - dddd"

现在,如果你有不同的格式要解析,你可以传递一个像这样的字符串格式数组作为 ParseExact 的第二个参数

 string[] formats = new string[] 
 {
    "dd/MM/yyyy hh:mm:ss tt", "MMMM dd, yyyy - dddd"
 };

 CultureInfo ci = new CultureInfo("ru");
 DateTime strTime = DateTime.ParseExact(date, formats, ci, DateTimeStyles.None);

【讨论】:

  • 您好,我正在尝试寻找解决方案来将任何不同的文化输入更改为英语文化和 yyyy-M-d
  • 但是,如果输入文化不是您系统区域设置的标准,您怎么知道呢?你有什么东西可以告诉你输入字符串的文化是什么吗?
  • 但是从您的问题中不清楚的是,您是否有一个特殊的应用程序需要在同一台 PC 上处理不同的文化。通常,如果您的 winforms 应用程序在俄罗斯计算机上运行,​​则 CultureInfo.CurrentCulture 将设置为俄语,而在意大利它将设置为意大利语等等。除非您有其他需求,否则单台计算机会使用操作系统的区域设置。
  • 问题是当你在 Value 属性中有一个完美的有效日期时你调用 ToString() 。您正在将日期转换为字符串,那么为什么要将其转换回 DateTime?将其保留为 DateTime, 在您需要显示它时使用 ToString() 来正确格式化它。 DateTime 本身没有格式,它是您想要显示它的方式,需要 format
猜你喜欢
  • 2012-09-05
  • 2012-10-07
  • 2017-08-22
  • 2012-03-31
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多