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)。我找不到关于第二个的任何信息。
谢谢
在你的第一个例子中你做了:
- 从
DateTime
(装在 Object
中)到 String
的转换。对于此转换,必须创建(内存保留)并填充字符串,具体取决于当前的文化设置。
- 比
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())
从 reader (reader["marketDate"]
) 中获取日期。结果的类型为 DateTime
.
此 DateTime 已转换为字符串 (.ToString()
)。
此字符串被转换回 DateTime (DateTime.Parse(...)
)。
如您所见,第2步和第3步是多余的,可以省略。这正是您的第二个代码示例所做的:
(DateTime)reader["marketDate"]
- 日期是从 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();
所以在这里,如果你看到这里发生了什么,在这个
- 从数据库 table
获取列 marketDate
的值
- 在 Date 对象上调用 String,它使 Date 值成为字符串表示形式
- 对我们从 Date 对象创建的字符串使用 Parse
- 再次调用ToString获取你需要的格式化字符串
所以,你在这里做了双重工作,你在数据类型之间来回转换,通常是no-no。
((DateTime)object)(这种情况的正确方法)
首先发生的事情是...
(DateTime)reader["marketDate"]
在这里,您正在获取为列 marketDate
和 Casting 提供的该行的值(这实际上是将类型从一种类型更改为另一种类型至少在 C# 中,因为转换机制可以被覆盖)
现在,如果我们看一下带变量的表达式
var dt = (DateTime)reader["marketDate"];
var myString = dt.ToString("dddd").ToUpper() + " " + marketDate.ToShortDateString();
这里我们 不是 yo-yoing 不同类型之间,这就是为什么这是最佳答案是有道理的。
我是 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)。我找不到关于第二个的任何信息。
谢谢
在你的第一个例子中你做了:
- 从
DateTime
(装在Object
中)到String
的转换。对于此转换,必须创建(内存保留)并填充字符串,具体取决于当前的文化设置。 - 比
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())
从 reader (
reader["marketDate"]
) 中获取日期。结果的类型为DateTime
.此 DateTime 已转换为字符串 (
.ToString()
)。此字符串被转换回 DateTime (
DateTime.Parse(...)
)。
如您所见,第2步和第3步是多余的,可以省略。这正是您的第二个代码示例所做的:
(DateTime)reader["marketDate"]
- 日期是从 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();
所以在这里,如果你看到这里发生了什么,在这个
- 从数据库 table 获取列
- 在 Date 对象上调用 String,它使 Date 值成为字符串表示形式
- 对我们从 Date 对象创建的字符串使用 Parse
- 再次调用ToString获取你需要的格式化字符串
marketDate
的值
所以,你在这里做了双重工作,你在数据类型之间来回转换,通常是no-no。
((DateTime)object)(这种情况的正确方法)
首先发生的事情是...
(DateTime)reader["marketDate"]
在这里,您正在获取为列 marketDate
和 Casting 提供的该行的值(这实际上是将类型从一种类型更改为另一种类型至少在 C# 中,因为转换机制可以被覆盖)
现在,如果我们看一下带变量的表达式
var dt = (DateTime)reader["marketDate"];
var myString = dt.ToString("dddd").ToUpper() + " " + marketDate.ToShortDateString();
这里我们 不是 yo-yoing 不同类型之间,这就是为什么这是最佳答案是有道理的。