夏令時實(shí)現(xiàn)

夏令時時間

夏令時只在某些國家實(shí)行
美國的夏令時是

  • 每年從3月份第2個星期天的2點(diǎn)開始,到11月份第1個星期天的1點(diǎn)結(jié)束,時間在標(biāo)準(zhǔn)時間基礎(chǔ)上加1小時,之后會回到正常時間。
  • 也有說是3月最后一個星期天1:00開始,10月最后一個星期天1:00結(jié)束。

參考

-L Daylight Saving Time(模擬)
-使用c語言描述夏時令期間

代碼

3月最后一個星期天1:00開始,10月最后一個星期天1:00結(jié)束。為準(zhǔn)

  • DaylightSavingsTime.h
#ifndef __GPSIMU_FILE_RECORD_H__
#define __GPSIMU_FILE_RECORD_H__

/***************************** Macro Definition ******************************/
//#define 
#define DAYLIGHT_SAVING_TIME 1 

/*********************************** Code ************************************/
/**function: CheckDaylightSavingsTime2
 * description: Check DaylightSavingsTime
 * 夏時令是3月最后一個星期天1:00開始,10月最后一個星期天1:00結(jié)束???
 * return: [0]-StandardTime, [1]-DST
 */
int CheckDaylightSavingsTime2(int Year, int month, int day, int hour, int minute, int second);

/**function: Time2DST2
 * description: time to DST
 * return: [0]-StandardTime, [1]-DST
 */
time_t Time2DST2(time_t tm_rect);
/**function: DST2Time2
 * description: DST 2 Time
 * return: [0]-StandardTime, [1]-DST
 */
time_t DST2Time2(time_t tm_rect);

#endif /* End of #ifndef __GPSIMU_FILE_RECORD_H__ */
  • DaylightSavingsTime.c
#include <pthread.h>
#include <sys/prctl.h>
#include <string.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include<math.h>

#include "DaylightSavingsTime.h"
/***************************** Macro Definition ******************************/
//#define 

/*************************** Structure Definition ****************************/
//typedef struct 

/***************************** Global Definition *****************************/

/***************************** Static Definition *****************************/
//static
const static short MonthDay[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

/*********************************** Code ************************************/
/************************************************/
/* 夏時令是3月最后一個星期天1:00開始,10月最后一個星期天1:00結(jié)束??? */
/************************************************/
/**
 * description: 計(jì)算輸入日期是今年的第幾天
 */
static int YMD_2_JD(int Year, int Month, int Day)
{
    int JD;
    int i;

    JD = Day;
    for (i = 0; i < Month; i++) 
    {
        JD += MonthDay[i];
    }
    if ((((Year%4==0) && (Year%100!=0)) || (Year%400==0)) && (Month>2)) 
    {
        JD++;
    }

    return JD;
}
/**
 * description: 計(jì)算輸入日期是星期幾
 */
static int YMD_2_WeekDay(int Year, int Month, int Day)
{
    int offset, jd, weekDay;

    // 公元元年1月1日是星期一
    // 按每年365天算,365 % 7 = 1,每年為52周多出一天
    // 還需要計(jì)算上閏年多出的天數(shù)
    offset = ((Year-1) + ((Year-1)/4 - (Year-1)/100 + (Year-1)/400)) % 7 ;// 計(jì)算上一年的最后一天是星期幾

    jd = YMD_2_JD(Year, Month, Day);// 獲取今天是第幾天
    weekDay = (jd + offset) % 7;// 上一年余的天數(shù)加上今年的天數(shù),計(jì)算出今天是星期幾

    return weekDay;
}
/**function: CheckDaylightSavingsTime2
 * description: Check DaylightSavingsTime
 * 夏時令是3月最后一個星期天1:00開始,10月最后一個星期天1:00結(jié)束???
 * return: [0]-StandardTime, [1]-DST
 */
int CheckDaylightSavingsTime2(int Year, int month, int day, int hour, int minute, int second)
{
    int flagDST = 0;
    int Month = 3, Day = 31, Month2 = 10, Day2 = 31;
    int weekday, weekday2;

    weekday = YMD_2_WeekDay(Year, Month, Day);//3月31是星期幾
    weekday2 = YMD_2_WeekDay(Year, Month2, Day2);//10月31是星期幾
    Day = Day - weekday;//3月最后一個星期天
    Day2 = Day2 - weekday2;//10月最后一個星期天

    struct tm *tm_now;
    time_t rect_now;
    time_t rect_start, rect_end;
    
    struct tm tblock;
    tm_now = &tblock;

    tm_now->tm_year = Year - 1900;
    tm_now->tm_mon = 3 - 1;
    tm_now->tm_mday = Day;
    tm_now->tm_hour = 1;
    tm_now->tm_min = 0;
    tm_now->tm_sec = 0;
    rect_start = mktime(tm_now);

    tm_now->tm_year = Year - 1900;
    tm_now->tm_mon = 10 - 1;
    tm_now->tm_mday = Day2;
    tm_now->tm_hour = 1;
    tm_now->tm_min = 0;
    tm_now->tm_sec = 0;
    rect_end = mktime(tm_now);

    tm_now->tm_year = Year - 1900;
    tm_now->tm_mon = month - 1;
    tm_now->tm_mday = day;
    tm_now->tm_hour = hour;
    tm_now->tm_min = minute;
    tm_now->tm_sec = second;
    rect_now = mktime(tm_now);
    
    if(rect_now >= rect_start && rect_now <= rect_end)
    {
        flagDST = 1;
    }
    else 
    {
        flagDST = 0;
    }
    
    return flagDST;
}
/**function: Time2DST2
 * description: time to DST
 * return: [0]-StandardTime, [1]-DST
 */
time_t Time2DST2(time_t tm_rect)
{
    time_t rect = tm_rect;
    struct tm tblock;
    struct tm *tm_now;
    tm_now = &tblock;
    tm_now = localtime(&rect);

    int isDST = CheckDaylightSavingsTime2(tm_now->tm_year+1900, tm_now->tm_mon+1, tm_now->tm_mday, tm_now->tm_hour, tm_now->tm_min, tm_now->tm_sec);
    if(isDST == 1)
    {
        rect = rect + (long)60 * 60;
        return rect;
    }

    return tm_rect;
}
/**function: DST2Time2
 * description: DST 2 Time
 * return: [0]-StandardTime, [1]-DST
 */
time_t DST2Time2(time_t tm_rect)
{
    time_t rect = tm_rect;
    struct tm tblock;
    struct tm *tm_now;
    tm_now = &tblock;

    rect = rect - (long)60 * 60;
    tm_now = localtime(&rect);

    int isDST = CheckDaylightSavingsTime2(tm_now->tm_year+1900, tm_now->tm_mon+1, tm_now->tm_mday, tm_now->tm_hour, tm_now->tm_min, tm_now->tm_sec);
    if(isDST == 1)
    {
        return rect;
    }

    return tm_rect;
}
  • 調(diào)用
    time_t rect = time(NULL);
    printf("rect:%lu", rect);
    rect = DST2Time2(rect);
    printf("DST2Time2 rect:%lu", rect);
    rect = Time2DST2(rect);
    printf("Time2DST2 rect:%lu", rect);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容