关于夏令时误差

对于跨地域的大型项目来说,不同地域的时间是比较头疼的问题,这次我就碰到了一个。系统场景是这样的,一个系统有2加机构,一个在波兰使用波兰的时区,一个在上海使用上海的时区,我们的系统为了方便用户修改时间,所以时间是和地域的机构所绑定的,同时也允许用户修改他们自己的时区和时间。在我们的系统时间的组成有2部分组成 sysdate(timezone)+time_off_set,是一个包含时区概念的系统时间+时间偏移量(小时)。

由于测试需要,由于现在波兰正处于夏令时,当我们的时间便宜了够大时又超出了夏令时,那么原则上你的时间一旦超出了夏令时你就应该补一个小时。这个时候java计算夏令时没有关系,java会自动给你补一个小时。但是plsql就会有问题 我原先使用的plsql如下:

F_GET_DATE_BY_TIME_ZONE(i_organ_id) +hours/24

很不幸这段plsql并没有为我们补回那失去的一小时,我现在的做法是时间偏移量使用天,而不用小时。

`mktime` 函数是 C 标准库中的函数,其实现比较复杂,需要考虑多个因素,比如闰年、夏令时、时区等。以下是一个简化版的 `mktime` 函数实现,仅考虑了不跨越夏令时和非闰年的情况: ```c #include <time.h> #define SECS_PER_DAY 86400 #define SECS_PER_HOUR 3600 #define SECS_PER_MINUTE 60 time_t my_mktime(struct tm *timeptr) { int year, month, day, hour, minute, second; int days_in_month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 获取年、月、日、时、分、秒 year = timeptr->tm_year + 1900; month = timeptr->tm_mon + 1; day = timeptr->tm_mday; hour = timeptr->tm_hour; minute = timeptr->tm_min; second = timeptr->tm_sec; // 计算天数 int days = (year - 1970) * 365; for (int i = 1970; i < year; i++) { if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) { days++; } } for (int i = 1; i < month; i++) { days += days_in_month[i - 1]; } if (month > 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)) { days++; } days += day - 1; // 计算秒数 time_t seconds = days * SECS_PER_DAY + hour * SECS_PER_HOUR + minute * SECS_PER_MINUTE + second; return seconds; } ``` 以上代码中,我们使用了一个 `days_in_month` 数组来保存每个月的天数,然后根据年、月、日计算出总共的天数,再将其转换为秒数即可。需要注意的是,由于 `struct tm` 结构体中的年份是从 1900 年开始计算的,因此需要将其加上 1900。此外,由于计算过程中没有考虑夏令时、时区等因素,因此在实际使用时可能会存在一定的误差
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值