1

Perl で 10 進数を MK Time に変換する方法。

私はこのドキュメントを取得します:

codes below are time decoding and encoding, for your reference

static const unsigned char rtc_days_in_month[] = {
    31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};

static const unsigned short rtc_ydays[2][13] = {
    /* Normal years */
    { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
    /* Leap years */
    { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
};

#define LEAPS_THRU_END_OF(y) ((y)/4 - (y)/100 + (y)/400)
#define LEAP_YEAR(year) ((!(year % 4) && (year % 100)) || !(year % 400))

u32 Mktime (u32 year, u32 mon,  u32  day, u32  hour,u32  min, u32  sec)
{
    if (0 >= (int) (mon -= 2)){    /**//* 1..12 -> 11,12,1..10 */
         mon += 12;      /**//* Puts Feb last since it has leap day */
         year -= 1;
    }

    return ((((unsigned long) (year/4 - year/100 + year/400 + 367*mon/12 + day) 
            + year*365 - 719499
          )*24 + hour
       )*60 + min
    )*60 + sec;
}

/*
 * The number of days in the month.
 */
s16 rtc_month_days(u16 month, u16 year)
{
    return rtc_days_in_month[month] + (LEAP_YEAR(year) && month == 1);
}


/*
 * The number of days since January 1. (0 to 365)
 */
s16 rtc_year_days(u16 day, u16 month, u16 year)
{
    return rtc_ydays[LEAP_YEAR(year)][month] + day-1;
}

void rtc_time_to_tm(u32 time, rtc_time *tm)
{
    s16 days, month, year;

    s16 newdays;

    days = time / 86400;
    time -= days * 86400;

    /* day of the week, 1970-01-01 was a Thursday */
    tm->tm_wday = (days + 4) % 7;

    year = 1970 + days / 365;
    days -= (year - 1970) * 365
        + LEAPS_THRU_END_OF(year - 1)
        - LEAPS_THRU_END_OF(1970 - 1);
    if (days < 0) {
        year -= 1;
        days += 365 + LEAP_YEAR(year);
    }
    tm->tm_year = year - 1900;
    tm->tm_yday = days + 1;

    for (month = 0; month < 11; month++) {
        newdays = days - rtc_month_days(month, year);
        if (newdays < 0)
            break;
        days = newdays;
    }
    tm->tm_mon = month + 1;
    tm->tm_mday = days + 1;

    tm->tm_hour = time / 3600;
    time -= tm->tm_hour * 3600;
    tm->tm_min = time / 60;
    tm->tm_sec = time - tm->tm_min * 60;
    tm->tm_year += 1900;
}



u32 Pro_Mktime (u32 year, u32 mon,  u32  day, u32  hour,u32  min, u32  sec)
{   
        u32 baseMk=0;
    u32 mk=0;
    u32 retMk=0;

    baseMk=Mktime(2000,1,1,0,0,0);
    mk=Mktime(year,mon,day, hour,min,sec);
    retMk=mk-baseMk;
    return retMk;

}

void Pro_Localtime (u32 mktime, rtc_time *tm)
{   
    struct tm  *tblock;
        u32 baseMk=0;
    u32 mk=0;
    baseMk=Mktime(2000,1,1,0,0,0);
    mk=mktime+baseMk;
    rtc_time_to_tm(mk,tm);
}

Javaではなくperlで進める必要があります。

10 進数の 430208245 を 2000 年 1 月 1 日 0 時間 1 日 0 時間 0 分 0 秒に変換する方法

4

2 に答える 2

1

最新の (つまり、少なくとも 5.10) Perl での最も簡単なアプローチは、Time::Pieceを使用することです。このモジュールはlocaltime関数をオーバーライドして、便利なオブジェクトを返すようにします。

use Time::Piece;
my $time = localtime(430208245);

その後、時刻と日付の個々の要素にアクセスできます。

say $time->year; # 1983
say $time->mon; # 8

全体を印刷します。

say $time; # Sat Aug 20 07:17:25 1983

または、strftimeメソッドを使用してカスタム形式で取得します。

say $time->strftime("%Y-%m-%dT%H:%M:%S"); # 1983-08-20T07:17:25
于 2013-10-25T09:15:51.057 に答える