夏令時時間
夏令時只在某些國家實行
美國的夏令時是
- 每年從3月份第2個星期天的2點開始沮榜,到11月份第1個星期天的1點結束,時間在標準時間基礎上加1小時喻粹,之后會回到正常時間蟆融。
- 也有說是3月最后一個星期天1:00開始,10月最后一個星期天1:00結束守呜。
參考
-L Daylight Saving Time(模擬)
-使用c語言描述夏時令期間
代碼
按3月最后一個星期天1:00開始型酥,10月最后一個星期天1:00結束。為準
- 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結束???
* 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結束??? */
/************************************************/
/**
* description: 計算輸入日期是今年的第幾天
*/
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: 計算輸入日期是星期幾
*/
static int YMD_2_WeekDay(int Year, int Month, int Day)
{
int offset, jd, weekDay;
// 公元元年1月1日是星期一
// 按每年365天算蓖谢,365 % 7 = 1,每年為52周多出一天
// 還需要計算上閏年多出的天數(shù)
offset = ((Year-1) + ((Year-1)/4 - (Year-1)/100 + (Year-1)/400)) % 7 ;// 計算上一年的最后一天是星期幾
jd = YMD_2_JD(Year, Month, Day);// 獲取今天是第幾天
weekDay = (jd + offset) % 7;// 上一年余的天數(shù)加上今年的天數(shù),計算出今天是星期幾
return weekDay;
}
/**function: CheckDaylightSavingsTime2
* description: Check DaylightSavingsTime
* 夏時令是3月最后一個星期天1:00開始岸更,10月最后一個星期天1:00結束???
* 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;
}
- 調用
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);