Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获得一天的开始和结束时间_C#_Datetime - Fatal编程技术网

C# 如何获得一天的开始和结束时间

C# 如何获得一天的开始和结束时间,c#,datetime,C#,Datetime,在我的C#应用程序中,我传递了一个格式为yyyymmdd yyyymmdd的字符串变量,该变量表示起始日期和截止日期。我想分别得到这些日期的开始和结束时间。目前我有下面的代码,但想知道是否有更优雅的解决方案 因此,对于pdr=20090521-20090523,将得到“20090521 00:00:00”和“20090523 23:59:59” DateTime对象有一个名为Date的属性,它只返回日期部分。(时间部分默认为上午12:00) 作为一种更优雅的解决方案(IMHO),我建议您在最后一

在我的C#应用程序中,我传递了一个格式为yyyymmdd yyyymmdd的字符串变量,该变量表示起始日期和截止日期。我想分别得到这些日期的开始和结束时间。目前我有下面的代码,但想知道是否有更优雅的解决方案

因此,对于pdr=20090521-20090523,将得到“20090521 00:00:00”和“20090523 23:59:59”


DateTime
对象有一个名为
Date
的属性,它只返回日期部分。(时间部分默认为上午12:00)

作为一种更优雅的解决方案(IMHO),我建议您在最后一天允许任何日期时间,然后在日期上添加1天,并比较允许时间大于或等于开始日期,但严格小于结束日期(加1天)

//调用代码。已设置beginDateTime和endDateTime。
//beginDateTime和endDateTime包含在内。
//targetDateTime是要检查的日期。
beginDateTime=beginDateTime.Date;
endDateTime=endDateTime.Date.AddDays(1);

如果(beginDateTime我会这么做,做一些小调整(其实没什么大不了的,只是吹毛求疵):

  • 应使用
    TryParse()
    /
    TryParseExact()
    方法返回
    false
    ,而不是引发异常
  • FormatException
    Exception
  • 无需检查长度==8,因为
    ParseExact()
    /
    TryParseExact()
    将执行此操作
  • “00:00:00”
    “23:59:59”
    是不需要的
  • return
    true
    /
    false
    是您能够解析的,而不是抛出异常(请记住检查此方法返回的值!)
代码:


如果您只担心.Net的精确度

startDate = DateTime.ParseExact(dates[0], "yyyyMMdd");
endDate = DateTime.ParseExact(dates[1], "yyyyMMdd").AddTicks(-1).AddDays(1);
对于时间部分,实际上不需要将额外的值连接到字符串上


作为附录,如果您将此用于查询,例如,数据库

startDate = DateTime.ParseExact(dates[0], "yyyyMMdd");
endDate = DateTime.ParseExact(dates[1], "yyyyMMdd").AddDays(1);
带着对…的疑问

WHERE "startDate" >= @startDate AND "endDate" < @endDate
其中“startDate”>=@startDate和“endDate”<@endDate

那么评论中提到的精度问题就无关紧要了。在这种情况下,endDate不是范围的一部分,而是外部边界。

您可以在某个地方定义两个扩展方法,在这样的实用程序类中:

public static DateTime EndOfDay(this DateTime date)
{
    return new DateTime(date.Year, date.Month, date.Day, 23, 59, 59, 999);
}

public static DateTime StartOfDay(this DateTime date)
{
    return new DateTime(date.Year, date.Month, date.Day, 0, 0, 0, 0);
}
public DoSomething()
{
    DateTime endOfThisDay = DateTime.Now.EndOfDay();
}
然后在这样的代码中使用它们:

public static DateTime EndOfDay(this DateTime date)
{
    return new DateTime(date.Year, date.Month, date.Day, 23, 59, 59, 999);
}

public static DateTime StartOfDay(this DateTime date)
{
    return new DateTime(date.Year, date.Month, date.Day, 0, 0, 0, 0);
}
public DoSomething()
{
    DateTime endOfThisDay = DateTime.Now.EndOfDay();
}

我很惊讶地看到,一位总统获得了如此多的选票:

正确的版本如下:

public static DateTime StartOfDay(this DateTime theDate)
{
    return theDate.Date;
}

public static DateTime EndOfDay(this DateTime theDate)
{
    return theDate.Date.AddDays(1).AddTicks(-1);
}
    LocalDate localDateStart = LocalDate.now();
    Date startDate = Date.from(localDateStart.atStartOfDay(ZoneId.systemDefault()).toInstant());

    LocalDate localDateEnd = localDateStart.plusDays(1);
    Date endDate = Date.from(localDateEnd.atStartOfDay(ZoneId.systemDefault()).toInstant());

我认为我们做错了。没有所谓的一天结束。
AddTick(-1)
只在没有小于一个刻度的时间间隔的约定下工作。这取决于实现。诚然,这个问题来自一个参考实现,即.Net Framework
DateTime
类,但我们仍然应该将此作为我们真正想要的函数不是
EndOfDay()的线索
但是
开始下一天()

我在C语言中使用以下命令#

然后在MS SQL中,我执行以下操作:

if datepart(ms, @dateEnd) = 0
   set @dateEnd = dateadd(ms, -3, @dateEnd)
这将导致MS SQL时间为23:59:59.997,这是成为第二天之前的最大时间

您可以简单地使用:

new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, 23, 59, 59, 999);
这将在MS SQL中工作,但在.Net端则不那么准确。

对于SQL Server(经过测试的2008 R2版本),此范围可以工作

开始日期“2016-01-11 00:00:01.990” 结束日期“2016-01-19 23:59:59.990”


看起来滴答声比一天的最后一秒更大,并自动舍入到第二天。因此,我测试并运行了一个带有两个日期的虚拟表,用于检查sql server捕获了哪些值并将这些参数插入到存储过程中。

在Java 8中,您可以使用LocalDate执行以下操作:

public static DateTime StartOfDay(this DateTime theDate)
{
    return theDate.Date;
}

public static DateTime EndOfDay(this DateTime theDate)
{
    return theDate.Date.AddDays(1).AddTicks(-1);
}
public static class DateTimeExtension {        
    public static DateTime StartOfTheDay(this DateTime d) => new DateTime(d.Year, d.Month, d.Day, 0, 0,0);
    public static DateTime EndOfTheDay(this DateTime d) => new DateTime(d.Year, d.Month, d.Day, 23, 59,59);
}
    LocalDate localDateStart = LocalDate.now();
    Date startDate = Date.from(localDateStart.atStartOfDay(ZoneId.systemDefault()).toInstant());

    LocalDate localDateEnd = localDateStart.plusDays(1);
    Date endDate = Date.from(localDateEnd.atStartOfDay(ZoneId.systemDefault()).toInstant());

我想通过解析字符串返回2个datetimes,这样调用方法就可以使用这些日期查询我的数据库。@马特:如果时间分辨率为亚秒,你的建议尤其合理。感谢你的评论。很高兴知道我的思路正确,并感谢tweaksNice的回答,但不正确。请查看屏幕截图我提供了一个例子来解释原因。事实上。使用Anar Khalilov的一个,它更好。我们可以只做9999999毫秒吗?这应该会产生相同的结果@anarkhalilov@IgorK,当然可以添加7个9。虽然不太可能,但如果将来.NET Framework设计者认为7不够,并将其设为10,那该怎么办鲁莽地编写代码,但为什么要冒险,不是吗?@anarkhalilov My bad,它无论如何都不会让我这么做。我应该先尝试一下。在创建新的DateTime对象时,if不会让您指定超过999毫秒。注意:如果您使用的是数据库,您可能必须阅读有关“一天结束”时数据库准确性的小字。我遇到的示例是SQL服务器日期时间类型。它精确到大约3毫秒,所以一天的结束时间变为.addmillizes(-3)@ChrisFCarroll就个人而言,我更喜欢使用
dtm>=start&&dtm
,其中end是您正在查找的日期。我想您已经让我意识到“一天的结束”实际上是一个不存在的概念,因此我们做得不对。使用
也不能解决精度问题,例如:
选择Cast When Cast('20140101 23:59:59.999'作为日期时间)
@ChrisFCarroll在这种情况下,
End
实际上是在第二天开始之前。如果您与表中的记录进行匹配,那么在这种情况下也不会发生匹配。如果值是
01/01/9999 00:00:00.000
,那会怎么样好了。我们为什么不加上秒(-1),而不是加上记号呢?一天中的最后一秒对于大多数情况来说都足够准确。正如@Chris F Carroll所提到的,-1记号可能也不正确。@liang,他提到:“只加上记号(-1)就可以了。”
    LocalDate localDateStart = LocalDate.now();
    Date startDate = Date.from(localDateStart.atStartOfDay(ZoneId.systemDefault()).toInstant());

    LocalDate localDateEnd = localDateStart.plusDays(1);
    Date endDate = Date.from(localDateEnd.atStartOfDay(ZoneId.systemDefault()).toInstant());