(*
日期时间戳互换:Smart Auto Control -- WangQuanFuGui 原创
时间戳:自1970年1月1日8时0分0秒为时间戳的开始时间,每过一秒加1;
本文时间戳计算方法:计算1970年1月1日8时0分0秒以来的时间总秒数,
首先计算闰年与平年个数,根据年份计算出总天数,再将总天数、当前小时、当前分钟分别别转换为秒数后相加,再加上当前的秒数。
*)
REGION _ReadTime_
//读取系统时间
#ReturnVal0 := RD_LOC_T(#SysTimeR);
//系统时间转换
#ReadSysTime.Year := UINT_TO_DINT(#SysTimeR.YEAR);
#ReadSysTime.Month := USINT_TO_DINT(#SysTimeR.MONTH);
#ReadSysTime.Day := USINT_TO_DINT(#SysTimeR.DAY);
#ReadSysTime.Hour := USINT_TO_DINT(#SysTimeR.HOUR);
#ReadSysTime.Minute := USINT_TO_DINT(#SysTimeR.MINUTE);
#ReadSysTime.Second := USINT_TO_DINT(#SysTimeR.SECOND);
#ReadSysTime.Microsecond := UDINT_TO_DINT(#SysTimeR.NANOSECOND);
END_REGION
//日期转换时间戳
REGION _ReadTimestamp_
//初始化
#DaysSince1970 := 0;
#SecondsInDay := 86400;
#leapYearsCount := 0;
#commonYearsCount := 0;
#CurrentDaysCount := 0;
//每月天数[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
#MonthDays[0] := 31;
#MonthDays[1] := 28;
#MonthDays[2] := 31;
#MonthDays[3] := 30;
#MonthDays[4] := 31;
#MonthDays[5] := 30;
#MonthDays[6] := 31;
#MonthDays[7] := 31;
#MonthDays[8] := 30;
#MonthDays[9] := 31;
#MonthDays[10] := 30;
#MonthDays[11] := 31;
//计算从1970年到当前年份前一年闰年平年个数
FOR #Year := 1970 TO #ReadSysTime.Year - 1 DO
//判断是否为闰年
#isLeapYear := (#Year MOD 4 = 0 AND #Year MOD 100 <> 0) OR (#Year MOD 400 = 0);
//闰年平年个数计算
IF #isLeapYear THEN
#leapYearsCount := #leapYearsCount + 1;
ELSE
#commonYearsCount := #commonYearsCount + 1;
END_IF;
END_FOR;
//判断当前年份是否为闰年
#isLeapYear := (#ReadSysTime.Year MOD 4 = 0 AND #ReadSysTime.Year MOD 100 <> 0) OR (#ReadSysTime.Year MOD 400 = 0);
IF #isLeapYear THEN
#MonthDays[1] := 29;
END_IF;
//计算当前年份前一个月的总天数
FOR #Month := 0 TO #ReadSysTime.Month - 2 DO
#CurrentDaysCount := #CurrentDaysCount + #MonthDays[#Month];
END_FOR;
//计算当前月份前一天的总天数
#CurrentDaysCount := #CurrentDaysCount + #ReadSysTime.Day - 1;
//计算1970年至今总天数计算
#DaysSince1970 := (#leapYearsCount * 366) + (#commonYearsCount * 365) + #CurrentDaysCount;
//计算时间戳(1970至今的总秒数)
#ReadTimestamp := #DaysSince1970 * #SecondsInDay + ((#ReadSysTime.Hour - 8) * 3600) + (#ReadSysTime.Minute * 60) + #ReadSysTime.Second;
END_REGION
//===============================================================================================================================================
//时间戳转换为日期
REGION _WriteTimestamp_
//初始化
#SecondsBeiJing := 28800;
#DaysSince1970 := 0;
#Year := 1970;
#Month := 0;
//计算自1970年1月1日以来的天数和当天的秒数
#DaysSince1970 := (#WriteTimestamp + #SecondsBeiJing) / #SecondsInDay;
#CurrentSecond := (#WriteTimestamp + #SecondsBeiJing) MOD #SecondsInDay;
// 计算从1970年开始到目标日期的年、月、日
WHILE #DaysSince1970 >= 365 DO
#isLeapYear := (#Year MOD 4 = 0 AND #Year MOD 100 <> 0) OR (#Year MOD 400 = 0);
IF #isLeapYear THEN
IF #DaysSince1970 >= 366 THEN
#DaysSince1970 := #DaysSince1970 - 366;
#Year := #Year + 1;
END_IF;
ELSE
#DaysSince1970 := #DaysSince1970 - 365;
#Year := #Year + 1;
END_IF;
END_WHILE;
// 计算当前年的月份和天数
#isLeapYear := (#Year MOD 4 = 0 AND #Year MOD 100 <> 0) OR (#Year MOD 400 = 0);
IF #isLeapYear THEN
#MonthDays[1] := 29;
ELSE
#MonthDays[1] := 28;
END_IF;
//计算当前年的月份和天数
WHILE #DaysSince1970 >= #MonthDays[#Month] DO
#DaysSince1970 := #DaysSince1970 - #MonthDays[#Month];
#Month := #Month + 1;
END_WHILE;
//计算当前年、月、日、时、分、秒
#WriteSysTime.Year := #Year;
#WriteSysTime.Month := #Month + 1;
#WriteSysTime.Day := #DaysSince1970 + 1;
#WriteSysTime.Hour := (#CurrentSecond / 3600) MOD 24;
#WriteSysTime.Minute := (#CurrentSecond MOD 3600) / 60;
#WriteSysTime.Second := #CurrentSecond MOD 60;
END_REGION
REGION _SetTime_
//设置时间脉冲沿
#SetTimeU := #SetSysTime AND NOT #SetTimeS;
#SetTimeS := #SetSysTime;
//设置系统时间
IF #SetTimeU THEN
//系统时间转换
#SysTimeW.YEAR := DINT_TO_UINT(#WriteSysTime.Year);
#SysTimeW.MONTH := DINT_TO_USINT(#WriteSysTime.Month);
#SysTimeW.DAY := DINT_TO_USINT(#WriteSysTime.Day);
#SysTimeW.HOUR := DINT_TO_USINT(#WriteSysTime.Hour);
#SysTimeW.MINUTE := DINT_TO_USINT(#WriteSysTime.Minute);
#SysTimeW.SECOND := DINT_TO_USINT(#WriteSysTime.Second);
//设置系统时间
#ReturnVal1 := WR_LOC_T(LOCTIME := #SysTimeW, DST := #SetDST);
END_IF;
END_REGION
(*
日期时间戳互换:Smart Auto Control -- WangQuanFuGui 原创
时间戳:自1970年1月1日8时0分0秒为时间戳的开始时间,每过一秒加1;
本文时间戳计算方法:计算1970年1月1日8时0分0秒以来的时间总秒数,
首先计算闰年与平年个数,根据年份计算出总天数,再将总天数、当前小时、当前分钟分别别转换为秒数后相加,再加上当前的秒数。
*)