1

我创建了以下代码来计算两个时间戳之间的持续时间,这两个时间戳可以有两种不同的格式:

public class dummyTime {
public static void main(String[] args) {
    try {
        convertDuration("2008-01-01 01:00 pm - 01:56 pm");
        convertDuration("2008-01-01 8:30 pm - 2008-01-02 09:30 am");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private static String convertDuration(String time) throws Exception {
    String ts[] = time.split(" - ");
    SimpleDateFormat formatNew = new SimpleDateFormat("HH:mm");
    Date beg, end;
    String duration = null;

    beg = getDateTime(ts[0]);
    end = getDateTime(ts[1], beg);

    duration = formatNew.format(end.getTime() - beg.getTime());
    System.out.println(duration + " /// " + time + " /// " + beg + " /// "
            + end);

    return duration;
}

private static Date getDateTime(String dateTime) throws ParseException {
    DateFormat formatOldDateTime = new SimpleDateFormat(
            "yyyy-MM-dd hh:mm aa");
    DateFormat formatOldTimeOnly = new SimpleDateFormat("hh:mm aa");
    Date date = null;

    try {
        date = formatOldDateTime.parse(dateTime);
    } catch (ParseException e) {
        date = formatOldTimeOnly.parse(dateTime);
    }

    return date;
}

private static Date getDateTime(String dateTime, Date orig)
        throws ParseException {
    Date end = getDateTime(dateTime);

    if (end.getYear() == 70) {
        end.setYear(orig.getYear());
        end.setMonth(orig.getMonth());
        end.setDate(orig.getDate());
    }

    return end;
}
}

它生成的输出是:

01:56 /// 2008-01-01 01:00 pm - 01:56 pm /// Tue Jan 01 13:00:00 CET 2008 /// Tue Jan 01 13:56:00 CET 2008
14:00 /// 2008-01-01 8:30 pm - 2008-01-02 09:30 am /// Tue Jan 01 20:30:00 CET 2008 /// Wed Jan 02 09:30:00 CET 2008

我的问题是:

  1. 为什么结果总是错误的(总是+1h)?
  2. 有什么更好的方法来识别没有日期的时间戳?== 70 看起来不太好,getDay 和 setDay 函数也被弃用了。

非常感谢,这个问题已经让我发疯了几个小时。

4

4 回答 4

4

您正在格式化一天中的时间,而不是小时数和分钟数。由于您在冬季处于 CET 时区 [中欧时间],因此与 UTC(“GMT”)相差一小时。

您可能想要使用Calendar而不是Date. 或乔达时间

于 2009-01-25T16:02:09.243 回答
2
  1. 在我的电脑上,这已经关闭了 2 小时,因为我在 GMT+2,而你可能在 GMT+1。请注意formatNew.format(end.getTime() - beg.getTime());接收日期,即将您的 56 分钟视为 1970-01-01-00:56:00 GMT+1。要快速解决此问题,请致电formatNew.setTimeZone( TimeZone.getTimeZone( "GMT" ) );

  2. 对于第二项,您可以检查 format-yyyy-MM-dd 是否失败(您发现解析错误),这就是您知道没有年份的方式。

于 2009-01-25T16:03:20.690 回答
1

简单的回答:使用 SimpleDateFormat 来格式化代表一天中没有日期的时间的值是不合适的。

更长的答案:Java 时间值是自“纪元”以来的毫秒数:1970 年 1 月 1 日午夜,UTC。

SimpleDateFormat 假定您为其提供了一个有效的时间戳,并将本地化转换应用于日期和时间。我怀疑您的语言环境比格林威治标准时间(欧洲大陆)晚一小时,这就是为什么您看到的结果比格林威治标准时间晚一小时。

虽然您可以通过设置时区 GMT 来欺骗 SimpleDateFormat,但您最好使用显式数学显示持续时间:

int duration = 90;
System.out.printf("%02d:%02d", duration / 60, duration % 60);
于 2009-01-25T16:06:39.703 回答
0
于 2017-01-29T00:24:08.457 回答