无法在uwp中将字符串转换为DateTime

时间:2016-05-30 06:02:15

标签: c# wpf winrt-xaml uwp uwp-xaml

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”

在运行此代码时,任何人都可以建议解决我的问题。

1 个答案:

答案 0 :(得分:1)

在UWP应用中,使用格式模板(如shortdatelongtime)时,默认情况下会使用用户的默认全局上下文,这些内容显示在设置中时间&语言即可。在我的电脑中,它们设置如下:
enter image description here 因此,当我在我身边使用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);
}

char数组会喜欢:
enter image description here

因此,为了解决您的问题,我建议您使用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);

这里的providernull,表示与当前文化对应的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参数并不重要。