c#((DateTime)对象)vs Datetime.Parse

时间:2016-01-05 14:22:08

标签: c# sqlite datetime date-conversion

我是c#的新手。

我有一个包含" marketDate"的SQLite表。字段(数据类型日期),我使用SQLiteDataReader。

我需要以这种方式构建一个字符串:星期一2016-01-03

到目前为止,我找到了两种方法:

1)

myString = (DateTime.Parse(reader["marketDate"].ToString())).ToString("dddd").ToUpper() + " " + (DateTime.Parse(reader["marketDate"].ToString())).ToShortDateString();

2)

myString = ((DateTime)reader["marketDate"]).ToString("dddd").ToUpper() + " " + ((DateTime)reader["marketDate"]).ToShortDateString();

我想知道哪种方式最好(最佳做法),如果有人能解释两种方法之间的差异,我真的很感激 datetime.parse < / strong>和(日期时间)对象)。我无法找到关于第二个的任何信息。

谢谢

4 个答案:

答案 0 :(得分:4)

此:

DateTime.Parse(reader["marketDate"].ToString())
  1. 从阅读器(reader["marketDate"])获取日期。结果类型为DateTime

  2. 此DateTime转换为字符串(.ToString())。

  3. 此字符串将转换回DateTime(DateTime.Parse(...))。

  4. 如您所见,步骤2和3是多余的,可以省略。这正是您的第二个代码示例所做的:

    (DateTime)reader["marketDate"]
    
    1. 从阅读器(reader["marketDate"])读取日期。这当前是DateTime类型,但编译器还不知道(因为读者的索引器返回超类型对象)。因此,我们通过显式转换它来告诉编译器我们知道这是DateTime。这允许我们在其上调用特定于DateTime的方法。
    2. 因为你问过最佳实践:你的第二个例子比第一个好。但是,我首选的解决方案是使用SQLiteDataReader.GetDateTime

      reader.GetDateTime("marketDate")
      

答案 1 :(得分:1)

在你的第一个例子中,你做了:

  1. DateTimeObject中的方框)转换为String的转换。对于此转换,必须创建一个字符串(内存预留)并填充,具体取决于当前的区域性设置。
  2. String转换回DateTime。解析也是基于当前的文化设置完成的。
  3. 两个操作一起是一个相对(投射)长的过程。两次转换完成后,String将再次从内存中删除,因为不再需要它。感觉有点多余,对吧?

    在你的第二个例子中,你使用了一个演员表。强制转换是一种相对简单的操作:它检查对象是否包含给定类型。如果是,则返回该对象,否则抛出InvalidCastException。

    在两个示例中,您重复两次操作两次。这样做一次会更快:

    DateTime marketDate = (DateTime)reader["marketDate"];
    myString = marketDate.ToString("dddd").ToUpper() + " " + marketDate.ToShortDateString();
    

    如果你想使用格式&#34; yyyy-MM-dd&#34;明确地(并且想要忽视文化环境),你可以使用:

    DateTime marketDate = (DateTime)reader["marketDate"];
    myString = marketDate.ToString("dddd yyyy-MM-dd").ToUpper();
    

    由于这是一个操作,你可以这样做:

    myString = ((DateTime)reader["marketDate"]).ToString("dddd yyyy-MM-dd").ToUpper();
    

答案 2 :(得分:1)

作为marketDate类型的Date字段,您可以将其投放到DateTime。然后以适当的方式得到它的表示:

((DateTime)reader["marketDate"]).ToString("dddd yyyy-MM-dd").ToUpper();

答案 3 :(得分:1)

击穿

想要从这里发生的事情细分开始,以帮助您更好地理解......这里发生了什么(应该想出更好的方式来表达这一点)。

DateTime.Parse(对于这种情况不是正确的方式)

在第一个例子中,我们关心的第一件事就是:

reader["marketDate"].ToString()

因此,将数据作为字符串读取,非常棒,让我们的生活更轻松,让我们将其分配给变量,然后完成剩下的工作

var str = reader["marketDate"].ToString();
var myStr = myString = 
                       (DateTime.Parse(str)).ToString("dddd").ToUpper() + " " 
                                + (DateTime.Parse(str)).ToShortDateString();

所以在这里,如果你看到这里发生了什么,在这个

  1. 从db table
  2. 获取列marketDate的值
  3. 在Date对象上调用String,该对象生成Date值的字符串表示
  4. 对我们从Date对象创建的字符串使用Parse
  5. 再次调用ToString以获取所需的格式化字符串
  6. 所以,你在这里做双重工作,你在数据类型之间来回转换,这通常是禁止的。

    ((DateTime)对象)(这种情况的正确方法)

    首先发生的事情是......

    (DateTime)reader["marketDate"]
    

    在这里,您将获取列marketDate投射的该行所给出的值(这实际上是将类型从一种类型更改为另一种类型,至少在C#中为可以覆盖转换机制)

    现在,如果我们查看带变量的表达式

    var dt = (DateTime)reader["marketDate"];
    var myString = dt.ToString("dddd").ToUpper() + " " + marketDate.ToShortDateString();
    

    这里我们在不同类型之间溜溜球,这就是为什么这是最好的答案。