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

c#((DateTime)对象)vs DateTime.Parse,c#,sqlite,datetime,date-conversion,C#,Sqlite,Datetime,Date Conversion,我是c#的新手 我有一个SQLite表,其中包含“marketDate”字段(数据类型Date),我正在使用SQLiteDataReader 我需要这样构建一个字符串:2016-01-03星期一 到目前为止,我找到了两种方法: (一) (二) 我想知道哪种方法是最好的(最佳实践),如果有人能给我解释一下这两种方法datetime.parse和(datetime)object)之间的区别,我将不胜感激。我找不到关于第二个的任何信息 谢谢在您的第一个示例中,您做到了: 从日期时间(在对象中装箱)到字

我是c#的新手

我有一个SQLite表,其中包含“marketDate”字段(数据类型Date),我正在使用SQLiteDataReader

我需要这样构建一个字符串:2016-01-03星期一

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

(一)

(二)

我想知道哪种方法是最好的(最佳实践),如果有人能给我解释一下这两种方法datetime.parse(datetime)object)之间的区别,我将不胜感激。我找不到关于第二个的任何信息


谢谢

在您的第一个示例中,您做到了:

  • 日期时间
    (在
    对象
    中装箱)到
    字符串
    的转换。对于此转换,必须创建一个字符串(内存保留)并填充,具体取决于当前区域性设置
  • 然后将
    字符串
    转换回
    日期时间
    。解析也基于当前区域性设置完成 这两个操作一起是一个相对(铸造)较长的过程。两次转换完成后,
    字符串将再次从内存中删除,因为不再需要它。感觉有点多余,对吧

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

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

    DateTime marketDate = (DateTime)reader["marketDate"];
    myString = marketDate.ToString("dddd").ToUpper() + " " + marketDate.ToShortDateString();
    
    如果要明确使用格式“yyyy-MM-dd”(并且不考虑文化背景),可以使用:

    DateTime marketDate = (DateTime)reader["marketDate"];
    myString = marketDate.ToString("dddd yyyy-MM-dd").ToUpper();
    
    由于这是一项操作,您可以执行以下操作:

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

    在第一个示例中,您可以:

  • 日期时间
    (在
    对象
    中装箱)到
    字符串
    的转换。对于此转换,必须创建一个字符串(内存保留)并填充,具体取决于当前区域性设置
  • 然后将
    字符串
    转换回
    日期时间
    。解析也基于当前区域性设置完成 这两个操作一起是一个相对(铸造)较长的过程。两次转换完成后,
    字符串将再次从内存中删除,因为不再需要它。感觉有点多余,对吧

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

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

    DateTime marketDate = (DateTime)reader["marketDate"];
    myString = marketDate.ToString("dddd").ToUpper() + " " + marketDate.ToShortDateString();
    
    如果要明确使用格式“yyyy-MM-dd”(并且不考虑文化背景),可以使用:

    DateTime marketDate = (DateTime)reader["marketDate"];
    myString = marketDate.ToString("dddd yyyy-MM-dd").ToUpper();
    
    由于这是一项操作,您可以执行以下操作:

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

  • 从读取器获取日期(
    读取器[“marketDate”]
    )。结果的类型为
    DateTime

  • 此日期时间转换为字符串(
    .ToString()

  • 此字符串被转换回日期时间(
    DateTime.Parse(…)

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

    (DateTime)reader["marketDate"]
    
  • 从读卡器读取日期(
    读卡器[“marketDate”]
    )。这是当前的类型
    DateTime
    ,但编译器还不知道(因为读者的索引器返回超类型对象)。因此,通过显式强制转换,我们告诉编译器我们知道这是一个
    DateTime
    。这允许我们对其调用特定于日期时间的方法
  • 因为您询问了最佳实践:您的第二个示例比第一个好。然而,我的首选解决方案是使用:

    这:

  • 从读取器获取日期(
    读取器[“marketDate”]
    )。结果的类型为
    DateTime

  • 此日期时间转换为字符串(
    .ToString()

  • 此字符串被转换回日期时间(
    DateTime.Parse(…)

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

    (DateTime)reader["marketDate"]
    
  • 从读卡器读取日期(
    读卡器[“marketDate”]
    )。这是当前的类型
    DateTime
    ,但编译器还不知道(因为读者的索引器返回超类型对象)。因此,通过显式强制转换,我们告诉编译器我们知道这是一个
    DateTime
    。这允许我们对其调用特定于日期时间的方法
  • 因为您询问了最佳实践:您的第二个示例比第一个好。然而,我的首选解决方案是使用:


    作为类型为
    Date
    marketDate
    字段,您可以将其强制转换为
    DateTime
    。然后以适当的方式获取其表示,使用以下方法:

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

    作为类型为
    Date
    marketDate
    字段,您可以将其强制转换为
    DateTime
    。然后以适当的方式获取其表示,使用以下方法:

    ((DateTime)reader["marketDate"]).ToString("dddd yyyy-MM-dd").ToUpper();
    
    崩溃 想从这里发生的事情开始,帮助你更好地理解…这里发生的事情(应该想一个更好的表达方式)

    Parse(对于这种情况,不是正确的方法) 在第一个示例中,我们首先关心的是:

    reader["marketDate"].ToString()
    
    因此,将数据作为字符串读取,非常棒,为了让我们的生活更轻松,让我们将其分配给一个变量,然后完成其余的工作

    var str = reader["marketDate"].ToString();
    var myStr = myString = 
                           (DateTime.Parse(str)).ToString("dddd").ToUpper() + " " 
                                    + (DateTime.Parse(str)).ToShortDateString();
    
    这里,如果你看到这里发生了什么,在这个

  • 从db表中获取列
    marketDate
    的值
  • 调用Date对象上的String,该对象生成日期值的字符串表示形式
  • 对从日期对象创建的字符串使用Parse
  • 再次调用ToString以获取所需的格式化字符串
  • 那么,你在做双份工作
    var dt = (DateTime)reader["marketDate"];
    var myString = dt.ToString("dddd").ToUpper() + " " + marketDate.ToShortDateString();