C#中如何获取某月最后一天

背景介绍:
在winform窗口中有两个dateTimePicker控件,该控件的时间格式可能是(yyyy,yyyy-MM,yyyy-MM-dd,yyyy-MM-dd HH:mm:ss)中任意一种,一个用于表示开始时间startTime,另一个表示结束时间endTime。
现在需要获取开始和结束时间的时间戳传给后台服务,用于查询数据。
对于大部分时间格式,一般使用下面代码就可以了。

DateTime sTime =TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); // 当地时区

string startTime = this.dateTimePicker1.Text;//获取开始时间
long startTimeStamp = (long)(Convert.ToDateTime(startTime) - sTime).TotalMilliseconds;//开始时间的时间戳,毫秒数

但是,对于只有年和只有年月的时间格式,Convert.ToDateTime(startTime) 会报错,因为Convert.ToDateTime(string)只接受标准格式的时间,所以需要对没有日的时间进行处理。

思路如下:

对于开始时间

  • yyyy格式的直接字符串组成yyyy-1-1
  • yyyy-MM格式组成yyyy-MM-1

对于结束时间
yyyy格式组成yyyy-12-31
yyyy-MM格式,先判断MM是否等于12,如是yyyy加一后,接上字符串“-1-1”;不等于12,月份加一后,接上字符串“-1”,然后转成时间戳,得到下个月1号的时间戳减去24小时的毫秒数或秒数。

System.TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); // 当地时区

string regexStr = "^([0-9]{1,4})(-([0-9]{1,2})(-([0-9]{1,2}))?)?$";//正则表达式判断日期,捕获型括号用于捕获匹配部分的内容

string startTime = this.dateTimePicker1.Text;
string startTimeYear = Regex.Match(startTime, regexStr).Groups[1].Value;
string startTimeMonth = Regex.Match(startTime, regexStr).Groups[3].Value;
string startTimeDay = Regex.Match(startTime, regexStr).Groups[5].Value;
if (startTimeDay == null || startTimeDay == "")
{
    if (startTimeMonth != null && startTimeMonth != "")//年月
    {
          startTime += "-1";
    }
    else //只有年
    {
          startTime += "-1-1";
    }
}
long startTimeStamp = (long)(Convert.ToDateTime(startTime) - sTime).TotalMilliseconds;//开始时间的时间戳,毫秒数

string endTime = this.dateTimePicker2.Text;
string endTimeYear = Regex.Match(endTime, regexStr).Groups[1].Value;
string endTimeMonth = Regex.Match(endTime, regexStr).Groups[3].Value;
string endTimeDay = Regex.Match(endTime, regexStr).Groups[5].Value;
long endTimeStamp = 0;//结束时间的时间戳,毫秒数
if (endTimeDay == null || endTimeDay == "")
{
    if (endTimeMonth != null && endTimeMonth != "")//年月
    {
        string tempTime = "";
        if (Int32.Parse(endTimeMonth) == 12)//结束时间的月份是12月
        {
            tempTime = (Int32.Parse(endTimeYear) + 1).ToString() + "-1-1";
        }
        else
        {
             tempTime = endTimeYear + "-" + (Int32.Parse(endTimeMonth) + 1).ToString() + "-1";
        }
    endTimeStamp = (long)(Convert.ToDateTime(tempTime) - sTime).TotalMilliseconds - 24 * 3600 * 1000;
    DateTime dt = sTime.AddMilliseconds(endTimeStamp);
    }
    else //只有年
    {
        endTime += "-12-31";
        endTimeStamp = (long)(Convert.ToDateTime(endTime) - sTime).TotalMilliseconds;
    }
}
else 
{
    endTimeStamp = (long)(Convert.ToDateTime(endTime) - sTime).TotalMilliseconds;
}
    原文作者:遨游奋飞
    原文地址: https://blog.csdn.net/qq_35938548/article/details/78325914
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞