Calendar.HOUR 引发的问题

本文详细解析了Java中使用Calendar类获取当天起始时间的常见错误,并提供了正确的实现方式。通过对比Calendar.HOUR与Calendar.HOUR_OF_DAY的区别,阐述了如何避免因时间制式选择不当导致的时间误差。
    /**
     * 获取今天的开始时间
     *
     * @return 今天的开始时间
     */
    public static long getTodayStartTime() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR, 0); // 此处错误 应该用  Calendar.HOUR_OF_DAY
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        return calendar.getTimeInMillis() / 1000;
    }

以上代码为获取 今天的起始秒数
如果你在 上午 时间测试的话,这个返回值时没问题的;
但是如果你在 下午 测试,你就会发现这个值 多了 12 * 60 * 60 (12个小时)


以下是 Calendar.HOURCalendar.HOUR_OF_DAY 的源代码注释。

    /**
     * Field number for <code>get</code> and <code>set</code> indicating the
     * hour of the morning or afternoon. <code>HOUR</code> is used for the
     * 12-hour clock (0 - 11). Noon and midnight are represented by 0, not by 12.
     * E.g., at 10:04:15.250 PM the <code>HOUR</code> is 10.
     *
     * @see #AM_PM
     * @see #HOUR_OF_DAY
     */
    public final static int HOUR = 10;

    /**
     * Field number for <code>get</code> and <code>set</code> indicating the
     * hour of the day. <code>HOUR_OF_DAY</code> is used for the 24-hour clock.
     * E.g., at 10:04:15.250 PM the <code>HOUR_OF_DAY</code> is 22.
     *
     * @see #HOUR
     */
    public final static int HOUR_OF_DAY = 11;

看源码注释,我们可以了解到:

  • Calendar.HOUR:设置的为12小时制的值,设置为0, 上午0点下午 则是12点
  • Calendar.HOUR_OF_DAY:设置的为24小时制的值,设置为0即为0点

所以,开头的代码需要修改为:

    /**
     * 获取今天的开始时间
     *
     * @return 今天的开始时间
     */
    public static long getTodayStartTime() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        return calendar.getTimeInMillis() / 1000;
    }
#include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "usart.h" #include "lora.h" #include "spilora.h" #include "rtc.h" #include "tsensor.h" #include "string.h" /************************************************ //STM32F103ZE核心板 lora实验 ************************************************/ #define MASTER 1//主机中MASTER为1,从机中SLAVE为1,正好相反 #define SLAVE 0 uint8_t last=1; uint8_t lastcur=1; uint8_t spiValue1=0; uint8_t spiValue2=0; uint8_t data = 0x0A; uint8_t RF_EX0_STATUS, CRC_Value, RLEN; uint8_t RecBuff[256]; int year, month, day, hour, minute, second; uint8_t flag=0; void key_process(void) { static uint8_t last = 1; // 静态变量保存上一次状态(假设引脚初始为高电平) uint8_t current_state = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4); // 检测按键状态变化(消抖逻辑) if (current_state != last) { delay_ms(10); // 消抖延时 current_state = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4); // 确认状态变化有效 if (current_state != last) { // 检测按键按下(下降沿触发) if (current_state == 0) { printf("LED0将开始闪烁\r\n"); flag=1; } // 检测按键释放(上升沿触发) else { printf("LED0将停止闪烁\r\n"); flag=0; } last = current_state; // 更新状态 } } } void build_LED(void) { if(flag==1) { LED0=!LED0; delay_ms(300); } else{ LED0=1; } } // 解析函数 void parse_datetime(const char *datetime_str) { // 格式:"24-05-20 08:38:00\r\n" // 注意:%d 会跳过前导 0,%2d 会精确匹配两个数字 sscanf(datetime_str, "%4d-%02d-%02d %02d:%02d:%02d", &year, &month, &day, &hour, &minute, &second); } void USART_SEND(u8 *BUFF,int len) { u16 t; for(t=0;t<len;t++) { USART_SendData(USART1, BUFF[t]);//向串口1发送数据 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束 } } int main(void) { short temp; uint8_t flag1=10; uint8_t flag2=3; uint8_t keynum=0; uint8_t count=0; u8 t=0; u16 len; u16 times=0; delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 LED_Init(); //LED端口初始化 KEY_Init(); //初始化与按键连接的硬件接口 spi_init(); lora_init(); RTC_Init(); T_Adc_Init(); while (1) { #if 0 LoRaReadBuff(REG_LR_FRFMSB, &spiValue1, 1); printf("spiValue1=%x",spiValue1); /*delay_ms(500); spiValue2=0X55; LoRaWriteBuff(REG_LR_FRFMSB, &spiValue2, 1); LoRaReadBuff(REG_LR_FRFMSB, &spiValue1, 1); printf("spiValue1=%x",spiValue1);*/ delay_ms(500); times++; if(times%2==0)LED0=!LED0;//闪烁LED,提示系统正在运行. #endif #if MASTER count=0; if(times%500==0&&count==0){ //5s发1次够了 告诉连接着 data = 0xFF;//IRQN_TXD_Value;//0xF7 LoRaWriteBuff(REG_LR_IRQFLAGSMASK, &data, 1); //关中断 data = 0xFF; LoRaWriteBuff(REG_LR_IRQFLAGS, &data,1); //一次写操作清除中断 FUN_RF_SENDPACKET("A向B问好.\r\n",27); //RF发送,LoRa最后从发送模式切换回待机模式 do{ LoRaReadBuff(REG_LR_IRQFLAGS, &RF_EX0_STATUS, 1); } while((RF_EX0_STATUS & 0x08) != 0x08);//等待发送完成 data = 0xFF; LoRaWriteBuff(REG_LR_IRQFLAGS, &data,1);//一次写操作清除发送完成中断 LED1=!LED1; delay_ms(100); times=0; } else { times++; } #endif count=1; if(USART_RX_STA&0x8000&&count==1) //如果有接收到数据则进行回传 { len = USART_RX_STA&0x3fff; //得到此次接收到的数据长度 printf("\r\n发送的消息为:\r\n"); for(t=0;t<len;t++) { USART_SendData(USART1, USART_RX_BUF[t]); //向串口1发送数据 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束 } if(len>=19&&USART_RX_BUF[4]=='-') { parse_datetime((const char*)USART_RX_BUF); printf("设定时间%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second); RTC_Set(year,month,day,hour,minute,second); flag1=10; } else if(strcmp(USART_RX_BUF,"显示温度")==0) { flag2=5; if(flag2>0) { temp = Get_Temprate(); //得到温度值 扩大了100倍 printf("Temperature: %f C\n", (float)temp/100); } delay_ms(100); } else if(t!=calendar.sec&&strcmp(USART_RX_BUF,"显示时间")==0) //显示时间 每秒显示1次 { t=calendar.sec; //printf("%d: %d: %d\n ", calendar.hour, calendar.min, calendar.sec); printf("当前时间%d-%2d-%2d %2d:%2d:%2d\n", calendar.w_year, calendar.w_month, calendar.w_date, calendar.hour, calendar.min, calendar.sec); } USART_RX_STA=0; delay_ms(10); //printf("%d: %d: %d\n ", calendar.hour, calendar.min, calendar.sec); } key_process(); build_LED(); } }
06-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值