private string GetSystem()
{
StringBuilder results = new StringBuilder();
DateTimeFormatter[] basicFormatters = new[]
{
// Default date formatters
new DateTimeFormatter("shortdate"),
// Default time formatters
new DateTimeFormatter("longtime"),
};
DateTime dateandTime = DateTime.Now;
foreach (DateTimeFormatter formatter in basicFormatters)
{
// Format and display date/time.
results.Append(formatter.Format(dateandTime));
results.Append(" ");
}
return results.ToString();
}
dateString = GetSystem();
format = "dd-MM-yyyy HH:mm:ss";
provider = new CultureInfo("en-IN");
try
{
result = DateTime.ParseExact(dateString, format, System.Globalization.CultureInfo.InvariantCulture);
Debug.WriteLine("{0} converts to {1}.", dateString, result.ToString());
}
catch (FormatException)
{
Debug.WriteLine("{0} is not in the correct format.", dateString);
}
我收到了错误
“字符串未被识别为有效的DateTime”
在运行此代码时,任何人都可以建议解决我的问题。
答案 0 :(得分:1)
在UWP应用中,使用格式模板(如shortdate
或longtime
)时,默认情况下会使用用户的默认全局上下文,这些内容显示在设置中强>在时间&语言即可。在我的电脑中,它们设置如下:
因此,当我在我身边使用GetSystem
方法时,dateString
就像
6/1/2016 1:44:43 PM
显然这不能用format = "dd-MM-yyyy HH:mm:ss";
解析。所以我认为在这里使用固定的自定义日期和时间格式字符串不是一个好习惯。
即使dateString
的格式与format
方法中使用的DateTime.ParseExact
相匹配,您也会收到错误:String was not recognized as a valid DateTime
。
这是因为,当我们使用DateTimeFormatter.Format
方法时,其返回值中有一些不可见的8206个字符。因此,dateString
看似30-05-2016 14:54:18
,但实际上并非30-05-2016 14:54:18
。为了清楚地看到这一点,我们可以将dateString
转换为char数组。这里使用“shortdate”模板,例如:
var dateString = new DateTimeFormatter("shortdate").Format(DateTime.Now);
var array = dateString.ToCharArray();
foreach (var item in arry)
{
Debug.WriteLine(item);
}
因此,为了解决您的问题,我建议您使用The General Date Long Time ("G") Format Specifier。
“G”标准格式说明符表示短日期(“d”)和长时间(“T”)模式的组合,以空格分隔。
您可以使用以下格式说明符:
var dateString = DateTime.Now.ToString("G");
然后将字符串转换为DateTime,如:
var result = DateTime.Parse(dateString);
或者
var result = DateTime.ParseExact(dateString, "G", null);
这里的provider
是null
,表示与当前文化对应的CultureInfo
对象。如果我们在这里使用错误的文化,我们也会获得String was not recognized as a valid DateTime
例外。
如果您确实想使用dd-MM-yyyy HH:mm:ss
格式,可以使用以下代码:
var dateString = DateTime.Now.ToString("dd-MM-yyyy HH:mm:ss");
转换与上面相同,只是在这种情况下provider
参数并不重要。