代码之家  ›  专栏  ›  技术社区  ›  David

如何确定一天的开始和结束时间

  •  82
  • David  · 技术社区  · 17 年前

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

    private void ValidateDatePeriod(string pdr, out DateTime startDate, 
                                    out DateTime endDate)
    {
        string[] dates = pdr.Split('-');
    
        if (dates.Length != 2)
        {
            throw new Exception("Date period is of incorrect format");
        }
    
        if (dates[0].Length != 8 || dates[1].Length != 8)
        {
            throw new Exception("Split date periods are of incorrect format");
        }
    
        startDate = DateTime.ParseExact(dates[0] + " 00:00:00", 
            "yyyyMMdd HH:mm:ss", null);
        endDate = DateTime.ParseExact(dates[1] + "23:59:59", 
            "yyyyMMdd HH::mm:ss", null);
    }
    
    11 回复  |  直到 7 年前
        1
  •  217
  •   Community Mohan Dere    9 年前

    我惊讶地发现 incorrect answer 获得了如此多的赞成票:

    Wrong value

    public static DateTime StartOfDay(this DateTime theDate)
    {
        return theDate.Date;
    }
    
    public static DateTime EndOfDay(this DateTime theDate)
    {
        return theDate.Date.AddDays(1).AddTicks(-1);
    }
    
        2
  •  40
  •   Andrei Rînea    17 年前

    你可以在某个地方定义两个扩展方法,比如在一个实用程序类中:

    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();
    }
    
        3
  •  24
  •   Tracker1    10 年前

    如果你只是担心。净精度。..

    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
    

    那么评论中提到的精度问题就不重要了。这 结束日期

        4
  •  15
  •   Jonathan Leffler    17 年前

    DateTime 对象具有一个名为的属性 Date

    我建议作为一种更优雅的解决方案(依我之见),如果你想在最后一天允许任何日期时间,那么你可以在日期上加1天,并比较允许时间大于或等于开始日期,但严格小于结束日期(加1天)。

    // Calling code.  beginDateTime and endDateTime are already set.
    // beginDateTime and endDateTime are inclusive.
    // targetDateTime is the date you want to check.
    beginDateTime = beginDateTime.Date;
    endDateTime = endDateTime.Date.AddDays(1);
    
    if ( beginDateTime <= targetDateTime &&
         targetDateTime < endDateTime )
       // Do something.
    
        5
  •  15
  •   Dominique    7 年前
    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);
    }
    
        6
  •  5
  •   Leon van Wyk    11 年前

    public static DateTime GetStartOfDay(DateTime dateTime)
    {
        return new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, 0, 0, 0, 0);
    }
    public static DateTime GetEndOfDay(DateTime dateTime)
    {
        return new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, 23, 59, 59, 999);
    }
    

    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);
    

        7
  •  4
  •   Lucas    17 年前

    这几乎就是我会做的,只是做了一些小的调整(真的没什么大不了的,只是吹毛求疵):

    • TryParse() / TryParseExact() false 而不是抛出异常。
    • FormatException Exception
    • 无需检查长度==8,因为 ParseExact() / TryParseExact()
    • "00:00:00" "23:59:59"
    • true / 错误的 您是否能够解析,而不是抛出异常(记得检查此方法返回的值!)

    private bool ValidateDatePeriod(string pdr, out DateTime startDate, 
                            out DateTime endDate)
    {
       string[] dates = pdr.Split('-');
    
       if (dates.Length != 2)
       {
           return false;
       }
    
       // no need to check for Length == 8 because the following will do it anyway
       // no need for "00:00:00" or "23:59:59" either, I prefer AddDays(1)
    
       if(!DateTime.TryParseExact(dates[0], "yyyyMMdd", null, DateTimeStyles.None, out startDate))
          return false;
    
       if(!DateTime.TryParseExact(dates[1], "yyyyMMdd", null, DateTimeStyles.None, out endDate))
          return false;
    
       endDate = endDate.AddDays(1);
       return true;
    }
    
        8
  •  3
  •   Chris F Carroll    12 年前

    AddTick(-1) DateTime EndOfDay() StartOfNextDay()

    public static DateTime StartOfNextDay(this DateTime date)
    {
        return date.Date.AddDays(1);
    }
    
        9
  •  0
  •   Ricardo Muñoz    10 年前

    例如:

    SELECT * FROM temp WHERE createdDate >= fromDate AND createdDate < toDate
    

    使用下面的扩展方法,您可以将起止日期设置为:

    DateTimeOffset fromDate = DateTimeOffset.UtcNow.StartOfDay();
    DateTimeOffset toDate = DateTimeOffset.UtcNow.EndOfDay();
    
    public static class DateExtentions
    {
        public static DateTimeOffset StartOfDay(this DateTimeOffset dateTime)
        {
            return new DateTimeOffset(dateTime.Year, dateTime.Month, dateTime.Day, 0, 0, 0, 0, dateTime.Offset);
        }
    
        public static DateTimeOffset EndOfDay(this DateTimeOffset dateTime)
        {
            return dateTime.StartOfDay().AddDays(1);
        }
    
        public static DateTimeOffset StartOfMonth(this DateTimeOffset dateTime)
        {
            return new DateTimeOffset(dateTime.Year, dateTime.Month, 1, 0, 0, 0, 0, dateTime.Offset);
        }
    
        public static DateTimeOffset EndOfMonth(this DateTimeOffset dateTime)
        {
            return dateTime.StartOfMonth().AddMonths(1);
        }
    
        public static DateTimeOffset StartOfYear(this DateTimeOffset dateTime)
        {
            return new DateTimeOffset(dateTime.Year, 1, 1, 0, 0, 0, 0, dateTime.Offset);
        }
    
        public static DateTimeOffset EndOfYear(this DateTimeOffset dateTime)
        {
            return dateTime.StartOfYear().AddYears(1);
        }
    }
    
        10
  •  0
  •   KayV    5 年前

    滴答声似乎比一天的最后一秒大,并自动四舍五入到第二天。因此,我进行了测试和工作,制作了一个带有两个日期的虚拟表,用于检查sql server捕获哪些值并将这些参数插入存储过程。