有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

减去两个java。sql。时间戳给出的年份不正确

我试图从sql中获取时间戳,需要计算两个时间戳之间的差异

//startDate = 2014-07-10 16:07:00.0
//endDate = 2014-07-11 04:07:00.0
//END_DATE = 2014-07-18 08:07:00.0

private Timestamp calculateWflTime(String vehicleNum, Timestamp startDate,
        Timestamp endDate) {
    Timestamp t1 = new Timestamp (END_DATE.getTime()); //2014-07-18 08:07:00.0
    Timestamp t2 = new Timestamp (startDate.getTime()); //2014-07-10 16:07:00.0
        Timestamp wflTime = null;
        long diff=0;
        if(VEH_NUM == vehicleNum){
            diff = t1.getTime()-t2.getTime();//diff(END_DATE,startDate);
        }
    wflTime = new Timestamp( Math.abs(diff/(1000*60*60*24)));
    return wflTime; //1970-01-01 05:30:00.007
}

共 (2) 个答案

  1. # 1 楼答案

    表情

    new Timestamp( Math.abs(diff/(1000*60*60*24)));
    

    从领域的角度来看,它在语义上是错误的。为什么?您尝试将一个时间量(实际上是一个以毫秒为单位的持续时间,没有固定在时间轴上)转换为一个时间点,该时间点在这里是固定的,可以从UNIX epoch(1970-01-01)开始计数。这就像从几何角度将一个长度转换成一个点

    两个时间戳之间的差异不应该是一个新的时间戳,而应该是一个持续时间(这里是以毫秒为单位的diff变量)。这取决于你如何将其正常化为几年或几个月

    回复OP后更新

    清洁Joda溶液:

    public static void main(String... args) {
        Timestamp t1 = new Timestamp(0);
        Timestamp t2 = new Timestamp(86400000 + 7261000);
        System.out.println(getDurationJoda(t1, t2));
        // output: 1 day, 2 hours, 1 minute, 1 second.
    }
    
    public static String getDurationJoda(Timestamp start, Timestamp end) {
        LocalDateTime ldtStart = new LocalDateTime(start);
        LocalDateTime ldtEnd = new LocalDateTime(end);
    
        Period p = new Period(ldtStart, ldtEnd, PeriodType.dayTime());
    
        PeriodFormatter fmt =
            new PeriodFormatterBuilder()
            .appendDays().appendSuffix(" day, ", " days, ")
            .appendHours().appendSuffix(" hour, ", " hours, ")
            .appendMinutes().appendSuffix(" minute, ", " minutes, ")
            .appendSeconds().appendSuffix(" second.", " seconds.").toFormatter();
        return fmt.print(p);
    }
    

    Time4J解决方案

    此外,您还可以使用my library Time4J实现这个替代方案,该库包含一个可本地化的PrettyTime类,用于自版本1.2以来的持续时间格式设置:

    private static final IsoUnit DAYS = CalendarUnit.DAYS;
    private static final IsoUnit HOURS = ClockUnit.HOURS;
    private static final IsoUnit MINUTES = ClockUnit.MINUTES;
    private static final IsoUnit SECONDS = ClockUnit.SECONDS;
    
    public static void main(String... args) {
      Timestamp t1 = new Timestamp(0);
      Timestamp t2 = new Timestamp(86400000 + 7261000);
      System.out.println(getDurationTime4J(t1, t2));
      // output: 1 day, 2 hours, 1 minute, and 1 second
    }
    
    public static String getDurationTime4J(Timestamp start, Timestamp end) {
      PlainTimestamp startTS = TemporalTypes.SQL_TIMESTAMP.transform(start);
      PlainTimestamp endTS = TemporalTypes.SQL_TIMESTAMP.transform(end);
    
      Duration<?> duration = 
        Duration.in(DAYS, HOURS, MINUTES, SECONDS).between(startTS, endTS);
      return PrettyTime.of(Locale.ENGLISH).print(duration, TextWidth.WIDE);
    }
    

    最后但并非最不重要的一点是,在格式化持续时间之前,请尝试评估字符串条件,并使用equals()而不是==,例如:

    if (VEH_NUM.equals(vehicleNum)) {
     // call getDuration(..., ...)
    } else {
     // return zero duration string
    }
    
  2. # 2 楼答案

    关于1970年的日期,一般来说,所有日期都是一个数字,表示1970年1月1日午夜后的毫秒数,因此,如果你将与类似日期之间的差异显示为一个日期,那么你将得到1970年的数据。你需要将答案视为毫秒,并将天、小时、分钟计算为时间。希望这有帮助