c# ((DateTime)object) vs Datetime.Parse

本文关键字:Datetime Parse vs object DateTime | 更新日期: 2023-09-27 18:29:05

我是c#的新手。

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

我需要用这种方式构建一个字符串:MONDAY 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(datetime)object)这两种方法之间的差异,我将不胜感激。我找不到关于第二个的任何信息。

感谢

c# ((DateTime)object) vs Datetime.Parse

这:

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

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

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

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

(DateTime)reader["marketDate"]
  1. 从读卡器读取日期(reader["marketDate"])。它当前的类型是DateTime,但编译器还不知道(因为读取器的索引器返回超类型对象)。因此,我们通过显式强制转换告诉编译器,我们知道这是一个DateTime。这允许我们对其调用DateTime特定的方法

既然你问了最佳实践:你的第二个例子比第一个好。然而,我的首选解决方案是使用SQLiteDataReader.GetDateTime:

reader.GetDateTime("marketDate")

作为类型为DatemarketDate文件,可以将其强制转换为DateTime。然后以适当的方式获得它的表示使用这个:

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

在您的第一个示例中:

  1. DateTime(装在Object中)到String的转换。对于此转换,必须创建一个字符串(内存保留)并填充,具体取决于当前的区域性设置
  2. 然后将CCD_ 14转换回CCD_。分析也是基于当前的区域性设置完成的

这两项操作加在一起是一个相对(相对于铸造)漫长的过程。当两个转换都完成时,String将再次从内存中删除,因为不再需要它。感觉有点多余,对吧?

在第二个示例中,您使用了强制转换。强制转换是一个相对简单的操作:它检查对象是否包含给定的类型。如果是,则返回该对象,否则将引发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();

细分

我想从这里发生的事情开始,帮助你更好地了解。。。这里发生了什么(应该想一个更好的表达方式)。

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

在第一个例子中,我们关心的第一件被执行的事情是:

reader["marketDate"].ToString()

所以把数据作为字符串读取,太棒了,为了让我们的生活更轻松,让我们把它分配给一个变量,然后做剩下的

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

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

  1. 从数据库表中获取列marketDate的值
  2. 调用Date对象上的String,从而生成Date值的字符串表示形式
  3. 对我们从Date对象创建的字符串使用Parse
  4. 再次调用ToString以获取所需的格式化字符串

因此,您在这里做双重工作,您在数据类型之间来回转换,这通常是一个禁忌。

((DateTime)对象)(适用于这种情况的正确方式)

正在发生的第一件事是…

(DateTime)reader["marketDate"]

在这里,您将为列marketDateCasting(这本质上是将类型从一种类型更改为另一种类型,至少在C#中是这样,因为强制转换机制可以被覆盖)

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

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

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