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

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

我是 c# 新手。

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

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

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

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)。我找不到关于第二个的任何信息。

谢谢

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

  1. DateTime(装在 Object 中)到 String 的转换。对于此转换,必须创建(内存保留)并填充字符串,具体取决于当前的文化设置。
  2. String 转换回 DateTime。解析也是基于当前的文化设置完成的。

这两个操作加在一起是一个相对(相对于铸造)较长的过程。当两个转换都完成后,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.Parse(reader["marketDate"].ToString())
  1. 从 reader (reader["marketDate"]) 中获取日期。结果的类型为 DateTime.

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

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

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

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

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

reader.GetDateTime("marketDate")

作为 Date 类型的 marketDate 字段,您可以将其转换为 DateTime。然后以适当的方式获得它的表示使用这个:

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

细分

想从这里发生的事情的细目开始,以帮助您更好地理解……这里发生的事情(应该想出更好的表达方式)。

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

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

reader["marketDate"].ToString()

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

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

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

  1. 从数据库 table
  2. 获取列 marketDate 的值
  3. 在 Date 对象上调用 String,它使 Date 值成为字符串表示形式
  4. 对我们从 Date 对象创建的字符串使用 Parse
  5. 再次调用ToString获取你需要的格式化字符串

所以,你在这里做了双重工作,你在数据类型之间来回转换,通常是no-no。

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

首先发生的事情是...

(DateTime)reader["marketDate"]

在这里,您正在获取为列 marketDateCasting 提供的该行的值(这实际上是将类型从一种类型更改为另一种类型至少在 C# 中,因为转换机制可以被覆盖)

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

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

这里我们 不是 yo-yoing 不同类型之间,这就是为什么这是最佳答案是有道理的。