在C#/ASP.NET中将日期时间转换为时间

在C#/ASP.NET中将日期时间转换为时间,c#,asp.net,datetime,time,C#,Asp.net,Datetime,Time,我正在尝试在asp.net项目中插入时间 RequestUpdateEmployeeDTR requestUpdateEmployeeDTR = new RequestUpdateEmployeeDTR(); requestUpdateEmployeeDTR.AttendanceDeducID = int.Parse(txtAttendanceDeducID.Text); requestUpdateEmployeeDTR.TimeInChange = txtTimeOutChange.Text;

我正在尝试在asp.net项目中插入时间

RequestUpdateEmployeeDTR requestUpdateEmployeeDTR = new RequestUpdateEmployeeDTR();
requestUpdateEmployeeDTR.AttendanceDeducID = int.Parse(txtAttendanceDeducID.Text);
requestUpdateEmployeeDTR.TimeInChange = txtTimeOutChange.Text;
requestUpdateEmployeeDTR.TimeOutChange = txtTimeOutChange.Text;

TimeInChange
TimeOutChange
DateTime
数据类型。但是我插入了一个时间数据类型。如何使用C#将其转换为时间数据类型?谢谢

NET Framework没有表示一天中某个时间的本机
Time
数据类型。您必须在以下三个选项中选择一个:

选择1 使用
DateTime
类型,忽略日期部分。选择超出应用程序正常值范围的日期。我通常使用
0001-01-01
,它可以方便地作为
DateTime.MinValue
使用

如果要从字符串解析时间,最简单的方法是使用
DateTimeStyles.NoCurrentDateDefault
选项。如果没有此选项,它将使用今天的日期而不是最小日期

DateTime myTime = DateTime.Parse("12:34", CultureInfo.InvariantCulture,
                                          DateTimeStyles.NoCurrentDateDefault);

// Result:  0001-01-01 12:34:00
当然,如果你喜欢使用今天的日期,你可以这样做。我只是认为它混淆了这个问题,因为你可能希望把它完全应用到其他日期

请注意,一旦有了
DateTime
值,就可以使用
.TimeOfDay
属性仅获取时间部分,表示为
TimeSpan
,这将导致选项2

选择2 使用
TimeSpan
类型,但在解释时要小心。请理解
TimeSpan
首先是一种表示经过的持续时间的类型,而不是一天中的某个时间。这意味着它可以存储超过24小时,也可以存储负值来表示时间的向后移动

当你把它当作一天中的一段时间时,你可能倾向于认为它是“从午夜起经过的时间”。然而,这会给你带来麻烦,因为在某些日子里,当地时区不存在午夜

例如,由于夏令时,在凌晨1:00开始。因此,这一天的
TimeSpan
时间跨度
8:00
实际上从1:00开始只经过了7个小时,而不是从午夜开始经过了8个小时

即使在美国,对于使用夏令时的地点来说,这个值也是误导性的。例如,DST回滚时有一个重复的小时。所以这一天的
TimeSpan
时间跨度
8:00
实际上从午夜开始已经9个小时了

因此,如果使用此选项,请注意将其视为与时钟匹配的代表性时间值,而不是“从午夜起经过的时间”

您可以使用以下代码直接从字符串中获取它:

TimeSpan myTime = TimeSpan.Parse("12:34", CultureInfo.InvariantCulture);
选择3 使用具有真实“时间”类型的库。您将在中找到它,它为在.NET中处理日期和时间提供了更好的API

表示“一天中的某个时间”的类型称为
LocalTime
,您可以从如下字符串中获取:

var pattern = LocalTimePattern.CreateWithInvariantCulture("HH:mm");
LocalTime myTime = pattern.Parse("12:34").Value;
由于您的问题表明您正在处理数据,因此我强烈建议您将其用于所有日期和时间需求。它会迫使你对你正在做的事情投入更多的思考。在此过程中,您将避免内置日期/时间类型可能带来的陷阱

如果在数据库(如SQL server)中存储
Time
类型,则会在.Net中将其转换为
TimeSpan
。因此,如果使用此选项,则需要将
LocalTime
转换为
TimeSpan
,如下所示:

TimeSpan ts = new TimeSpan(myTime.TickOfDay);

使用
DateTime.Parse()
DateTime.ParseExact()
。我假设您的数据库中有
Time
列?您可以尝试使用
TimeOfDay
属性,或使用
TimeSpan
而不是
DateTime