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)这两种方法之间的差异,我将不胜感激。我找不到关于第二个的任何信息。
感谢
这:
DateTime.Parse(reader["marketDate"].ToString())
从读取器获取日期(
reader["marketDate"]
)。结果的类型为DateTime
。此DateTime被转换为字符串(
.ToString()
)。此字符串被转换回DateTime(
DateTime.Parse(...)
)。
正如您所看到的,步骤2和3是多余的,可以省略。这正是您的第二个代码示例所做的:
(DateTime)reader["marketDate"]
- 从读卡器读取日期(
reader["marketDate"]
)。它当前的类型是DateTime
,但编译器还不知道(因为读取器的索引器返回超类型对象)。因此,我们通过显式强制转换告诉编译器,我们知道这是一个DateTime
。这允许我们对其调用DateTime特定的方法
既然你问了最佳实践:你的第二个例子比第一个好。然而,我的首选解决方案是使用SQLiteDataReader.GetDateTime:
reader.GetDateTime("marketDate")
作为类型为Date
的marketDate
文件,可以将其强制转换为DateTime
。然后以适当的方式获得它的表示使用这个:
((DateTime)reader["marketDate"]).ToString("dddd yyyy-MM-dd").ToUpper();
在您的第一个示例中:
- 从
DateTime
(装在Object
中)到String
的转换。对于此转换,必须创建一个字符串(内存保留)并填充,具体取决于当前的区域性设置 - 然后将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();
所以在这里,如果你看到这里发生了什么,在这个中
- 从数据库表中获取列
marketDate
的值 - 调用Date对象上的String,从而生成Date值的字符串表示形式
- 对我们从Date对象创建的字符串使用Parse
- 再次调用ToString以获取所需的格式化字符串
因此,您在这里做双重工作,您在数据类型之间来回转换,这通常是一个禁忌。
((DateTime)对象)(适用于这种情况的正确方式)
正在发生的第一件事是…
(DateTime)reader["marketDate"]
在这里,您将为列marketDate
和Casting(这本质上是将类型从一种类型更改为另一种类型,至少在C#中是这样,因为强制转换机制可以被覆盖)
现在,如果我们看看带有变量的表达式
var dt = (DateTime)reader["marketDate"];
var myString = dt.ToString("dddd").ToUpper() + " " + marketDate.ToShortDateString();
在这里,我们是而不是在不同类型之间徘徊,这就是为什么这是最好的答案。