programing

Excel 시리얼 날짜 번호를 로 변환하려면 어떻게 해야 하나요?NET 날짜 시간?

showcode 2023. 4. 10. 22:24
반응형

Excel 시리얼 날짜 번호를 로 변환하려면 어떻게 해야 하나요?NET 날짜 시간?

Excel 시리얼 날짜에서로 변환하려면 어떻게 해야 하나요?NET 날짜 시간?

예를 들어 39938은 05/05/2009입니다.

FromOADate 방법을 사용하면 다음과 같이 간단합니다.

DateTime dt = DateTime.FromOADate(39938);

이 코드 dt는 "05/05/2009" 입니다.

여기서 39938은 1900년 1/1 이후의 일수입니까?

이 경우 프레임워크라이브러리 기능을 사용합니다.
함수는 모든 세부 사항을 캡슐화하고 경계 검사를 수행합니다.

그 이력의 가치에 대해서는, 다음과 같이 실장할 수 있는 것은, 다음과 같습니다.

(C#)

public static DateTime FromExcelSerialDate(int SerialDate)
{
    if (SerialDate > 59) SerialDate -= 1; //Excel/Lotus 2/29/1900 bug   
    return new DateTime(1899, 12, 31).AddDays(SerialDate);
}

VB

Public Shared Function FromExcelSerialDate(ByVal SerialDate As Integer) As DateTime
    If SerialDate > 59 Then SerialDate -= 1 ' Excel/Lotus 2/29/1900 bug
    Return New DateTime(1899, 12, 31).AddDays(SerialDate)
End Function

[갱신] :
음... 간단한 테스트를 해보니 이틀이나 쉬었네요어디가 다른지 모르겠어.

네, 문제가 해결되었습니다.상세한 것에 대하여는, 코멘트를 참조해 주세요.

39938 의 경우는, 다음의 순서에 따릅니다.39938 * 864000000000 + 599264352000000000

864000000000은 59926435200000000000의 하루 틱 수를 나타냅니다.이것은, 0001년부터 1900년까지의 틱 수를 나타냅니다.

void ExcelSerialDateToDMY(int nSerialDate, int &nDay, 
                          int &nMonth, int &nYear)
{
    // Excel/Lotus 123 have a bug with 29-02-1900. 1900 is not a
    // leap year, but Excel/Lotus 123 think it is...
    if (nSerialDate == 60)
    {
        nDay    = 29;
        nMonth    = 2;
        nYear    = 1900;

        return;
    }
    else if (nSerialDate < 60)
    {
        // Because of the 29-02-1900 bug, any serial date 
        // under 60 is one off... Compensate.
        nSerialDate++;
    }

    // Modified Julian to DMY calculation with an addition of 2415019
    int l = nSerialDate + 68569 + 2415019;
    int n = int(( 4 * l ) / 146097);
            l = l - int(( 146097 * n + 3 ) / 4);
    int i = int(( 4000 * ( l + 1 ) ) / 1461001);
        l = l - int(( 1461 * i ) / 4) + 31;
    int j = int(( 80 * l ) / 2447);
     nDay = l - int(( 2447 * j ) / 80);
        l = int(j / 11);
        nMonth = j + 2 - ( 12 * l );
    nYear = 100 * ( n - 49 ) + i + l;
}

재능 있는 사람의 컷앤페이스트...

이안 브라운

언급URL : https://stackoverflow.com/questions/727466/how-do-i-convert-an-excel-serial-date-number-to-a-net-datetime

반응형