如何计算c#中日期的开始日期和结束日期

时间:2016-08-25 17:14:40

标签: c# date datetime

我有一个日期进入我的c#程序,如下所示:“2015年1月15日”,我需要将其转换为这样的字符串:“2015-01-15T00:00:00Z”(即,那天的开始)。我打电话给第三方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";
        }
    }

3 个答案:

答案 0 :(得分:1)

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

仅供参考:请确保检查文化。

enter image description here

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

答案 1 :(得分:0)

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个字符串,这是日期实例格式化并附加硬编码的日期开头和日期结束为一个字符串。

答案 2 :(得分:0)

如果你想在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
}