使用C#中的函数格式化日期和时间

时间:2017-06-08 08:27:22

标签: c# winforms

所以我从显卡获取驱动程序日期并将其显示为TextBox,但是值为20161216000000.000000-000,我希望将其转换为实际日期。

我已经有了一个转换这种日期的功能,但是这种情况不起作用,使用后它就像01-01-0001 00:00:00一样向我显示。

这是我的功能代码:

private static string FormatDateTime(object ObjInstallDate)
{
    object FinalDate = DBNull.Value;
    string strDate = Convert.ToString(ObjInstallDate);
    DateTime dtm;
    DateTime.TryParseExact(strDate, new string[] { "yyyyMMdd", "yyyy-MM-dd", "dd-MM-yyyy" },
        System.Globalization.CultureInfo.InvariantCulture,
        System.Globalization.DateTimeStyles.None, out dtm);
    if (!String.IsNullOrEmpty(strDate))
    {
        FinalDate = dtm;
    }
    return FinalDate.ToString();
}

你知道我在这种情况下如何20161216000000.000000-000 2016-12-16之类的内容吗?

3 个答案:

答案 0 :(得分:0)

获取子字符串可以完成工作(如果格式总是如图所示):

DateTime.TryParseExact(strDate.Substring(0, 8), "yyyyMMdd",
    System.Globalization.CultureInfo.InvariantCulture,
    System.Globalization.DateTimeStyles.None, out DateTime dtm);

要获得显示结果所需的格式,您可以使用

dtm.ToString("yyyy-MM-dd");

答案 1 :(得分:0)

在查看您的代码和问题后,看起来您传递给该函数的日期不是c#支持的正确/预期格式,这就是为什么它为您提供默认系统的开始日期 01-01-0001 00:00:00 此处。

但是,作为一个工作,我可以观察到输入值的前8位是日期部分,所以你可以按照以下方式使用它:

DateTime.TryParseExact(strDate.Substring(0, 8), "yyyyMMdd",
System.Globalization.CultureInfo.InvariantCulture,
System.Globalization.DateTimeStyles.None, out dtm);

return dtm.ToString("yyyy-MM-dd");

答案 2 :(得分:0)

您只需确保您的格式符合您的输入,而您提供的输入格式均不符合您的输入。

了解custom dateformat specifiers和字面字符如何与您的输入对齐。

         Your input: 20161216000000.000000-000   
  format specifiers: yyyyMMddhhmmss.ffffff-000  

将这种格式带到您的方法中,您将获得:

// takes an object, returns a DateTime or null in case of failure
DateTime FormatDateTime(object ObjInstallDate)
{
    DateTime dtm;
    if (!DateTime.TryParseExact(
        (string) ObjInstallDate, // notice that we don't hassle with the input here, 
                                 // only cast to a string
                                 // we simply rely on the parser of DateTimer.TryParseExact
        "yyyyMMddhhmmss.ffffff-000",  // this matches the format
                                      // if the -000 represents a timezone
                                      // you can use z00 or zz0 
                                      // don't use zzz as that expects -0:00
        System.Globalization.CultureInfo.InvariantCulture,
        System.Globalization.DateTimeStyles.None, 
        out dtm)) 
    {
        // an invalid date was supplied, maybe throw, at least log
        Console.WriteLine("{0} is not valid", ObjInstallDate);
    }
    // we either return here null or a valid date
    return dtm; // !! No ToString() here
}

我从Custom Date and Time Format Strings中选择了所需的自定义格式值。

请注意,我只返回已创建的DateTime实例。你会看到我为什么这么做。

由于你想在Winform上显示DateTime(我假设在文本框中,但标签也可以工作),你现在可以简单地将DateTime实例数据绑定到文本框,让数据绑定管道进行格式化。这是一个可以在LinqPad中运行的代码示例:

// take a string and make a date of it
var str = "20161216000000.000000-000";
DateTime dtm = FormatDateTime(str);

// show it on a Databind TextBox
var f = new Form();
var txt = new TextBox();
txt.Width = 200;
// bind the Text property
txt.DataBindings.Add(
    "Text",  // property on the textbox
    dtm, // our DateTime object
    null, // use the DateTime instance, not a property
    true, // use formatting 
    DataSourceUpdateMode.OnValidation, 
    null, // value to indicate null
    "yyyy-MM-dd"); // our format
f.Controls.Add(txt);
f.Show();

我在DataBindingsCollection上使用带有Format字符串的Add重载。然后,我可以使用相同的自定义格式说明符选项来表示我想要的DateTime实例。从这里可以很容易地添加另一个TextBox,它使用相同的DateTime实例,但在文本中显示月份。

当所有这些结合在一起时,这将是你的结果:

winform shows textbox with 2016-12-01 as date