十六进制字符串转日期时间格式

问题描述 投票:0回答:3

我正在将十六进制字符串转换为日期格式...我收到以下错误的日期时间..不确定我在哪里犯了错误。

    String s1="07:db:0c:08:16:0d:1e:00";    //2011-12-8,22:13:30.0
    s1 = s1.replaceAll(":", "");
    String year = s1.substring(0, 4);
    String month = s1.substring(4, 6);
    String day = s1.substring(6, 8);
    String hour = s1.substring(8, 10);
    String minute = s1.substring(10, 12);
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, Integer.parseInt(year, 16));
    cal.set(Calendar.MONTH, Integer.parseInt(month, 16));
    cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(day, 16));
    cal.set(Calendar.HOUR, Integer.parseInt(hour, 16));
    cal.set(Calendar.MINUTE, Integer.parseInt(minute, 16));
   System.out.println(cal.getTime());

我的输出是“Mon Jan 09 10:13:49 CST 2012”..这是不正确的(应该是 2011-12-8,22:13:30.0 - 现在忽略格式)。

java datetime hex
3个回答
4
投票
Java 中的月份用整数 0..11 表示,即一月为 0, ...,十二月为 11。在此代码中,

Integer.parseInt(month, 16)

 返回 12,Calendar 对象将移至明年一月(通过增加年份)。

-编辑-

另外,在
HOUR_OF_DAY

 中设置 
HOUR
而不是
cal.set(Calendar.HOUR, Integer.parseInt(hour, 16));


2
投票
一些注意事项:

    Calendar 类中的月份是
  1. 从 0-11,其中 0 是一月。
  2. toString 格式可能会有所不同
  3. 你忘记了秒数:

    String second = s1.substring(12, 14); cal.set(Calendar.SECOND, Integer.parseInt(second, 16));
    
    

0
投票
避免遗留日期时间类

您使用的是有严重缺陷的日期时间类,这些类现在已成为遗留的,并被 JSR 310 中定义的现代

java.time 类所取代。

java.time 与遗留类相比,

java.time

类使用合理的编号。这意味着 1 月至 12 月的 1-12 个月数字。因此,如果使用 LocalDateTime

 而不是 
Calendar,您的代码将有效。
String input = "07:db:0c:08:16:0d:1e:00";    //2011-12-8,22:13:30.0
input = input.replaceAll( ":" , "" );
String year = input.substring( 0 , 4 );
String month = input.substring( 4 , 6 );
String day = input.substring( 6 , 8 );
String hour = input.substring( 8 , 10 );
String minute = input.substring( 10 , 12 );

LocalDateTime ldt =
        LocalDateTime.of(
                Integer.parseInt( year , 16 ) ,
                Integer.parseInt( month , 16 ) ,
                Integer.parseInt( day , 16 ) ,
                Integer.parseInt( hour , 16 ) ,
                Integer.parseInt( minute , 16 )
        );

System.out.println( "ldt = " + ldt );

ldt.toString() = 2011-12-08T22:13

© www.soinside.com 2019 - 2024. All rights reserved.