背景介绍:
在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;
}