Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 防止用户系统设置时间和日期字符串处理_C#_Winforms_Date_Datetime_Time - Fatal编程技术网

C# 防止用户系统设置时间和日期字符串处理

C# 防止用户系统设置时间和日期字符串处理,c#,winforms,date,datetime,time,C#,Winforms,Date,Datetime,Time,我正在尝试加载进程中的日期时间和时间字符串 DateTime strTime = DateTime.ParseExact(strTime.Trim(), "dd/MM/yyyy hh:mm:ss tt", CultureInfo.InvariantCulture); 我有几个地方可以处理dateTimePicker中的日期时间字符串: UseDate = dateTimePicker1.Value.ToString("MMMM dd, yyyy - dddd"); 通过写入,然后从文

我正在尝试加载进程中的日期时间和时间字符串

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.
我可以用replace
“/”
”,防止输入不同标点符号,并从字符串中删除所有单词,但在这种情况下,我不确定如何找到正确的方法


例如,在调试中,我看到带有俄语的
strTime
“ааааааааааааааааааа。我不能用正则表达式处理它,因为在结果中,我可以得到像
102017
或至少
10.20.17
但不是
2017年4月10日
,它必须是
10.04.2017
10/04/2017
10-04-2017
或甚至是以不同的顺序
4/10/2017

<
string
转换为
DateTime
,只需正确的文化信息和格式字符串。使用示例字符串,解析它的方法如下:

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);

您使用的是DateTime.ParseExact,这意味着您提供的格式掩码应该与您作为字符串传递的内容完全匹配,以便转换为DateTime

如果对该字符串进行俄文转换(“2017年10月10日-2017年11月10日”),您应提供带有适当文化信息的此类面具

 "MMMM dd, yyyy - dddd"
现在,如果您有不同的格式要解析,您可以传递,作为第二个参数来解析一个字符串格式数组,就像下面这样

 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);

也许这有助于你的意见来自哪里?你能制作一个只允许一种格式的editmask吗?还是它来自一个你无能为力的外部源?@GuidoG Hello,question Edited所以他必须知道使用哪种文化信息。如果他的输入中混入了什么呢?不,你不需要知道。由于OP使用winforms,只要使用
CurrentCulture
就可以使
ParseExact
工作,只要日期字符串具有适当的格式,就可以完成此答案+1@Pikoh是的,通过这种方式我可以将其更改为不同的,但我正在尝试找到将任何不同的文化输入更改为英语文化yyyy-m-dHello的方法,我试图找到解决方案,将任何不同的区域性输入更改为Englesh culture和yyyy-m-DB。但是,如果输入区域性不是系统区域设置的标准设置,您如何知道输入区域性?您是否有一些信息可以告诉您输入字符串的区域性是什么?但您的问题不清楚的是,您是否有一个特殊的应用程序需要在同一台电脑上处理不同的区域性。通常,如果您的winforms应用程序在俄罗斯计算机上运行,则CultureInfo.CurrentCulture将设置为俄语,而在意大利,它将是意大利人等等。除非您有其他需要,否则一台计算机会使用操作系统中的区域设置。问题是,当Value属性中有一个完美的有效日期时,您会调用ToString()。您正在将日期转换为字符串,那么为什么要将其转换回日期时间?。将其保留为DateTime,并且仅当需要显示时,才使用ToString()来正确设置其格式。DateTime本身没有格式,您想要显示它的方式需要一种格式