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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值