C#,Asp.NET 导入Excel,时间格式变成数字串处理方法

在Excel中.日期或者时间格式为:42093.6506944444 或者 0.650694444444444

大于0 表示有日期(2015-03-30),小于零则是时间(15:37)

在C# 导入读取这列时,转换会发生错误;

现在将这格式转换为正常的日期格式:如下:


/// <summary>
    /// 数字转换时间格式
    /// </summary>
    /// <param name="timeStr">数字,如:42095.7069444444/0.650694444444444</param>
    /// <returns>日期/时间格式</returns>
    private string ToDateTimeValue(string strNumber)
    {
        if (!string.IsNullOrWhiteSpace(strNumber))
        {
            Decimal tempValue;
            //先检查 是不是数字;
            if (Decimal.TryParse(strNumber, out tempValue))
            {
                //天数,取整
                int day = Convert.ToInt32(Math.Truncate(tempValue));
                //这里也不知道为什么. 如果是小于32,则减1,否则减2
                //日期从1900-01-01开始累加 
                // day = day < 32 ? day - 1 : day - 2;
                DateTime dt = new DateTime(1900, 1, 1).AddDays(day < 32 ? (day - 1) : (day - 2));
 
                //小时:减掉天数,这个数字转换小时:(* 24) 
                Decimal hourTemp = (tempValue - day) * 24;//获取小时数
                //取整.小时数
                int hour = Convert.ToInt32(Math.Truncate(hourTemp));
                //分钟:减掉小时,( * 60)
                //这里舍入,否则取值会有1分钟误差.
                Decimal minuteTemp = Math.Round((hourTemp - hour) * 60, 2);//获取分钟数
                int minute = Convert.ToInt32(Math.Truncate(minuteTemp));
                //秒:减掉分钟,( * 60)
                //这里舍入,否则取值会有1秒误差.
                Decimal secondTemp = Math.Round((minuteTemp - minute) * 60, 2);//获取秒数
                int second = Convert.ToInt32(Math.Truncate(secondTemp));
 
                //时间格式:00:00:00
                string resultTimes = string.Format("{0}:{1}:{2}",
                        (hour < 10 ? ("0" + hour) : hour.ToString()),
                        (minute < 10 ? ("0" + minute) : minute.ToString()),
                        (second < 10 ? ("0" + second) : second.ToString()));
 
                if (day > 0)
                    return string.Format("{0} {1}", dt.ToString("yyyy-MM-dd"), resultTimes);
                else
                    return resultTimes;
            }
        }
        return string.Empty;
    }

原文链接:https://blog.csdn.net/XMM_1030/article/details/45580331 

 

2019/05/24更新:

参考了上面这位朋友的写法,发现从Excel中读取到的数据,有些还是少了一秒。修改代码如下:

private string ToDateTimeValue(string strNumber)
{
	if (!string.IsNullOrWhiteSpace(strNumber))
	{
		Decimal tempValue;
		//先检查 是不是数字;
		if (Decimal.TryParse(strNumber, out tempValue))
		{
			int day = 0;
			int hour = 0;
			int minute = 0;
			int second = 0;
			int totalSecond = 0;

			//天数,取整,整数部分即为天数
			day = Convert.ToInt32(Math.Truncate(tempValue));

			//获取除去天数后剩下的秒数,四舍五入后取整
			totalSecond = Convert.ToInt32(Math.Truncate(Math.Round((tempValue - day) * 24 * 60 * 60)));

			//计算小时数,如果秒数大于一小时,说明存在小时数
			if (totalSecond > 3600)
				hour = totalSecond / 3600;
			else
				hour = 0;

			//计算分钟数,减去得到的小时数之后,如果剩下的秒数大于一分钟,说明存在分钟数
			if ((totalSecond - hour * 3600) > 59)
				minute = (totalSecond - hour * 3600) / 60;
			else
				minute=0;
			
			//减去小时数、分钟数用到的秒数之后,余下的就是最终的秒数
			second = totalSecond - hour * 3600 - minute * 60;

			//将天数累计到小时数上
			hour = hour + day * 24;

			//时间格式:00:00:00
			string resultTimes = string.Format("{0}:{1}:{2}",
					(hour < 10 ? ("0" + hour) : hour.ToString()),
					(minute < 10 ? ("0" + minute) : minute.ToString()),
					(second < 10 ? ("0" + second) : second.ToString()));
			
			return resultTimes;
		}
	}
	return strNumber;
}

注意:

1. 改写的这部分代码,不是24小时制的时间格式,因为Excel中可能会这类时间数据,程序稍微做了改动;

《C#,Asp.NET 导入Excel,时间格式变成数字串处理方法》

2. 基本思路是:从Excel中读取到的数字串其实是天数,先将其转成秒数,再四舍五入得到整型的秒数(这里可以解决缺少一秒的问题),再另外计算时、分、秒; 

    原文作者:大橘本橘
    原文地址: https://blog.csdn.net/qq_24470501/article/details/89537778
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞