【问题标题】:How to calculate start of day and end of day from a date in c#如何从c#中的日期计算一天的开始和结束
【发布时间】:2026-01-17 00:15:02
【问题描述】:

我的 c# 程序中有一个日期,如下所示:“01/15/2015”,我需要将其翻译成这样的字符串:“2015-01-15T00:00:00Z”(即那一天的开始)。我正在调用期望该格式的第 3 方 api。

然后我需要取相同的日期并将其转换为:“2015-01-15T23:59:59Z”(即给定的一天结束)。

这就是我所拥有的,根据我所做的有限测试,它似乎可以工作,但我想知道这是否容易出错,或者是否有更好的方法来实现这一点。我以前没有使用过这种格式的日期,所以我想我会问那些有更多经验的人。 T23:59:59Z 会是我服务器所在时区的一天结束吗?

程序示例:

    class Program
    {
        static void Main(string[] args)
        {
            Search("01/15/2015");
        }

         private static void Search(string date) 
        {
            //produce this:                                    
            //string startOfDay = "2015-01-15T00:00:00Z";                        
            //string endOfDay = "2015-01-15T23:59:59Z";

            DateTime temp1 = DateTime.Parse(date);
            string startOfDay = temp1.ToString("yyyy-MM-ddTHH:mm:ssK") + "Z";

            DateTime temp2 = DateTime.Parse(date);
            string endOfDay = temp2.ToString("yyyy-MM-ddT") + "23:59:59Z";
        }
    }

【问题讨论】:

  • 我认为您希望在 code review 上发布此内容,而不是堆栈交换。
  • 2015-01-15T00:00:00Z 是 UTC 日 的开始,而不是当前时区的一天的开始。你要哪一个?
  • 我认为您不希望在格式字符串中使用 K

标签: c# date datetime


【解决方案1】:

一天的开始很容易;你可以使用.Date

仅供参考:请务必检查文化。

class Program
{
    static void Main(string[] args)
    {

        DateTime date;
        if (DateTime.TryParse("01/15/2015", out date))
        {
            var startOfDay = date.Date;
            Console.WriteLine(startOfDay.ToString("s") + "Z");

            var endOfDay = date.ToEndOfDay();
            Console.WriteLine(endOfDay.ToString("s") + "Z");
        }

        Console.ReadLine();
    }
}

public static class DateExtensions
{
    public static DateTime ToEndOfDay(this DateTime date)
    {
        return date.Date.AddDays(1).AddTicks(-1);
    }
}

【讨论】:

  • 我喜欢这个,谢谢。但是您能否详细说明“确保检查文化”是什么意思?
  • 如果您使用英语以外的语言,您可能希望在解析字符串时包含 CultureInfo
【解决方案2】:
private static void Search(string date)
{
    DateTime parsedDate;
    if (DateTime.TryParseExact(date, "MM/dd/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out parsedDate))
    {
        var dateString = parsedDate.ToString("yyyy-MM-dd");
        var dateStart = dateString + "T00:00:00Z";
        var dateEnd = dateString + "T23:59:59Z";
    }
}

这完全忽略了时区或 UTC,它只是将传入的字符串转换为 DateTime 表示,然后创建 2 个字符串,即格式化的日期实例并将硬编码的一天的开始和一天的结束作为字符串附加.

【讨论】:

    【解决方案3】:

    如果您想完全在 ANSI C 中完成,那就去吧 - 这个代码片段将让您在从头开始构建时间/日期字符串的 char 级别上玩弄它。干杯...

    char time_str[22], swap_str[3]; // my time string to build and swap data
    
    void append_tdata(int t_unit, char delimiter); // generic append with dl
    
    main(void)
    {
       time_t t;          // I believe everything here is ANSI C
       struct tm *gmt;    // and should be very portable
       t = time(NULL);
    
       gmt = gmtime(&t);  // get zulu time
    
       // start building my string with the year
       itoa(gmt->tm_year + 1900, time_str, 10);
    
       append_tdata(gmt->tm_mon, '-');   // YYYY-MM
       append_tdata(gmt->tm_mday, '-');  // YYYY-MM-DD
       append_tdata(gmt->tm_hour, 'T');  // YYYY-MM-DDTHH
       append_tdata(gmt->tm_min, ':');   // YYYY-MM-DDTHH:MM
       append_tdata(gmt->tm_sec, ':');   // YYYY-MM-DDTHH:MM:SS
       time_str[strlen(time_str) + 1] = 0x0;
       time_str[strlen(time_str)] = 'Z'; // YYYY-MM-DDTHH:MM:SSZ
    
       // time_str build is done - do with it as you like
    }
    
    //---------------------------------------------------------------
    void append_tdata(int t_unit, char delimiter)
    {
       time_str[strlen(time_str) + 1] = 0x0;
       time_str[strlen(time_str)] = delimiter;
    
       if(t_unit < 10) // is the number added to string only one digit?
         {             // if so - pad it with a zero
           swap_str[0] = '0';
           itoa(t_unit, &swap_str[1], 10);
         }
       else
        itoa(t_unit, swap_str, 10); // otherwise just give me the number
    
       strcat(&time_str[strlen(time_str)], swap_str); // add it to my string plz
    }
    

    【讨论】:

      最近更新 更多