首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将excel中的时间格式化列转换为C# DateTime

将excel中的时间格式化列转换为C# DateTime
EN

Stack Overflow用户
提问于 2013-08-21 13:05:55
回答 4查看 18.5K关注 0票数 5

我目前正在使用Excel C#库(Microsoft.Office.Interop.Excel)将excel电子表格读入到我的C#应用程序中。

一开始我试着把所有的单元格作为原始数据来读取,但是发现日期格式的单元格给了我一个5位数的整数,而时间格式的单元格返回了十进制数。因此,我发现您可以使用在Excel的C#库中内置的日期转换方法,如下所示:

代码语言:javascript
运行
复制
DateTime excelDate = (DateTime)ExcelCalcValue.ExcelDateToDateTime(workbook, Double.Parse(cell.Value.ToString()));
output = excelDate.ToString("yyyy-MM-dd HH:mm");

通过使用各种测试表调试我的应用程序,我能够记录单元格以不同方式格式化时返回的各种格式字符串。这些建议如下:

代码语言:javascript
运行
复制
(WorksheetCell.CellFormat.FormatString)

Times

[$-F400]h:mm:ss\\ AM/PM
hh:mm:ss;@
h:mm:ss;@
[$-409]hh:mm:ss\\ AM/PM;@
[$-409]h:mm:ss\\ AM/PM;@

Dates

m/d/yy
[$-F800]dddd\\,\\ mmmm\\ dd\\,\\ yyyy
dd/mm/yyyy;@
dd/mm/yy;@
d/m/yy;@
d\\.m\\.yy;@
yyyy\\-mm\\-dd;@
[$-809]dd\\ mmmm\\ yyyy;@
[$-809]d\\ mmmm\\ yyyy;@

使用这些,我现在可以可靠地确定excel中单元格的格式样式。使用前面的代码,我可以检测到一个日期格式的单元格,并以DateTime格式返回正确的数据。但是,我看不到转换时间格式化单元格的等效函数.

当我读取一个单元格时间格式为0.58368055555555554时,会得到[$-F400]h:mm:ss\\ AM/PM的结果。我完全不知道如何将其转换为DateTime,也不知道这个浮点数代表什么。

有人能建议一种将时间格式的excel单元格(作为一个奇怪的浮点数存储)转换为正确的DateTime变量的方法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-21 13:30:54

正如FrankPI所说,使用DateTime.FromOADate()。您可以将此函数与Excel单元格中的原始数据一起使用--不需要解析格式。

Excel将其日期和时间编码为双倍。整数部分代表1900年1月1日以后的日子。分数部分表示从一天中所引用的午夜开始的时间。例如:

1.5 is January 1, 1900 @ Noon

41507.25 = August 21, 2013 @ 6:00 am

有关此函数的更多信息,请参阅MSDN文档:

http://msdn.microsoft.com/en-us/library/system.datetime.fromoadate.aspx

票数 14
EN

Stack Overflow用户

发布于 2013-08-21 13:15:02

“奇怪的浮点”可能也可以通过DateTime方法转换为DateTime.FromOADate()。实际上,它是从1900年1月1日起的天数,时间是分数,例如,1:01上午1 :01的0.04236 = 1/24 + 1/(24 * 60)

票数 3
EN

Stack Overflow用户

发布于 2018-01-18 09:17:06

我编写了这个函数来处理从Excel到C#的日期输入。它为日期单元格处理了许多数据类型的可能性:

代码语言:javascript
运行
复制
/// <summary>
/// Returns DateTime?
/// Excel dates are double values, and sometimes, they're typical dd/mm/yyyy dates.
/// This function handles both possibilities, and the possibility of a blank date input. 
/// /// 
/// </summary>
/// <param name="inputDate"></param>
/// <returns></returns>
private static DateTime? ResolveExcelDateInput(string inputDate)
{
    double incomingDate = 0;

    DateTime incomingDateDate = new DateTime();

    // If the incoming date is a double type, parse it into DateTime
    if (Double.TryParse(inputDate, out incomingDate))
    {
        return DateTime.FromOADate(incomingDate);
    }

    // IF the incoming date value is a date type, parse it.
    var parseDateResult = DateTime.TryParse(inputDate, out incomingDateDate);

    if(parseDateResult)
    {
        // If the parse is successful return the date
        return incomingDateDate;
    }
    else
    {
        // If the parse isn't successful; check if this a blank value and set to a default value.
        if(string.IsNullOrWhiteSpace(inputDate))
        {
            return new DateTime(1901, 1, 1);
        }
        else
        {
            // Otherwise return null value so that is then handled by the validation logic.
            // log a validation result because inputDate is likely an invalid string value that has nothing to do with dates.
            return null;
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18358275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档