我是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>和(日期时间)对象)。我无法找到关于第二个的任何信息。
谢谢
答案 0 :(得分:4)
此:
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")
答案 1 :(得分:1)
在你的第一个例子中,你做了:
DateTime
(Object
中的方框)转换为String
的转换。对于此转换,必须创建一个字符串(内存预留)并填充,具体取决于当前的区域性设置。 String
转换回DateTime
。解析也是基于当前的文化设置完成的。 两个操作一起是一个相对(投射)长的过程。两次转换完成后,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)
想要从这里发生的事情细分开始,以帮助您更好地理解......这里发生了什么(应该想出更好的方式来表达这一点)。
在第一个例子中,我们关心的第一件事就是:
reader["marketDate"].ToString()
因此,将数据作为字符串读取,非常棒,让我们的生活更轻松,让我们将其分配给变量,然后完成剩下的工作
var str = reader["marketDate"].ToString();
var myStr = myString =
(DateTime.Parse(str)).ToString("dddd").ToUpper() + " "
+ (DateTime.Parse(str)).ToShortDateString();
所以在这里,如果你看到这里发生了什么,在这个
marketDate
的值
所以,你在这里做双重工作,你在数据类型之间来回转换,这通常是禁止的。
首先发生的事情是......
(DateTime)reader["marketDate"]
在这里,您将获取列marketDate
和投射的该行所给出的值(这实际上是将类型从一种类型更改为另一种类型,至少在C#中为可以覆盖转换机制)
现在,如果我们查看带变量的表达式
var dt = (DateTime)reader["marketDate"];
var myString = dt.ToString("dddd").ToUpper() + " " + marketDate.ToShortDateString();
这里我们不在不同类型之间溜溜球,这就是为什么这是最好的答案。