繁体   English   中英

如何从C#中的日期计算一天的开始和一天的结束

[英]How to calculate start of day and end of day from a date in c#

我的C#程序中有一个日期,例如:“ 01/15/2015”,我需要将其转换为这样的字符串:“ 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";
        }
    }

一天的开始很容易; 您可以只使用.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);
    }
}
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个字符串,该字符串是该日期实例的格式,并将硬编码的开始日期和结束日期附加为字符串。

如果您想在ANSI C中完全完成此操作,那么您可以-此代码段将使您在从零开始构建时间/日期字符串的字符级上随意使用它。 干杯...

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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM