【问题标题】:Difference between two Calendar times. One hour more in result两个日历时间之间的差异。结果多一小时
【发布时间】:2014-10-03 11:51:16
【问题描述】:

我在日历中有 2 次。

    Calendar orarioP1 = new GregorianCalendar(2014, 3, 28, 8, 30, 00);
    Calendar orarioA1 = new GregorianCalendar(2014, 3, 28, 12, 35, 06);  

我实现了这个函数来获取时差,但它返回了 +1 小时的时差。
我需要返回正确的差异4:05:06,但现在它返回给我5:05:06。谁能帮帮我?

public String getTimeDiff() {

    SimpleDateFormat sdf = new SimpleDateFormat("h:mm:ss");
    long milliSec1 = orarioP1.getTimeInMillis();
    long milliSec2 = orarioA1.getTimeInMillis();

    long timeDifInMilliSec;
    if(milliSec1 >= milliSec2) {
        timeDifInMilliSec = milliSec1 - milliSec2;
    } else {
        timeDifInMilliSec = milliSec2 - milliSec1;
    }

    long timeDifSeconds = timeDifInMilliSec / 1000;
    long timeDifMinutes = timeDifInMilliSec / (60 * 1000);
    long timeDifHours = timeDifInMilliSec / (60 * 60 * 1000);
    long timeDifDays = timeDifInMilliSec / (24 * 60 * 60 * 1000);

    Date date = new Date(timeDifSeconds);
    String difference = sdf.format(date);

    return difference;
}

【问题讨论】:

标签: java date time difference milliseconds


【解决方案1】:

试试这样的

    Calendar orarioP1 = new GregorianCalendar(2014, 3, 28, 8, 30, 00);
    orarioP1.setTimeZone(TimeZone.getTimeZone("GMT"));
    Calendar orarioA1 = new GregorianCalendar(2014, 3, 28, 12, 35, 06);
    orarioA1.setTimeZone(TimeZone.getTimeZone("GMT"));
    System.out.println("Difference In Hours : "
       +(orarioA1.get(Calendar.HOUR_OF_DAY)-orarioP1.get(Calendar.HOUR_OF_DAY)));
    System.out.println("Difference In Minutes : "
        +(orarioA1.get(Calendar.MINUTE)-orarioP1.get(Calendar.MINUTE)));
    System.out.println("Difference In Seconds : "
        +(orarioA1.get(Calendar.SECOND)-orarioP1.get(Calendar.SECOND)));
    System.out.println("Difference In MiliSeconds : "
       +(orarioA1.get(Calendar.MILLISECOND)-orarioP1.get(Calendar.MILLISECOND)));

【讨论】:

    【解决方案2】:

    你误会了。 new Date(long timemillisec) 将返回 since January 1, 1970, 00:00:00 GMT + your timemillisec 的 Date 实例。

    是您的时区使January 1, 1970, 00:00:00 有点接近January 1, 1970, 05:~:~

    只需使用:

    String difference = sdf.format(new Date(0));
    

    您将得到相同的结果,即在您的情况下有 1 小时的差异,这是由于与 GMT 的时差。
    看看你的代码,你正在将毫秒转换为秒,你不需要那个。
    只需使用毫秒:Date date = new Date(timeDifInMilliSec);

    看看这个:

     SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MMM/dd h:mm:ss");
     System.out.println(sdf.format(new Date(0)));
     System.out.println(sdf.format(new Date(1000)));
    

    输出

    1970/Jan/01 5:30:00
    1970/Jan/01 5:30:01
    

    这是我的位置。

    【讨论】:

    • 我试图改变字符串差异 = sdf.format(date);到字符串差异 = sdf.format(new Date(0));但它给了我与真实结果不同的其他结果!
    • 首先你必须纠正你的错误。在您的代码中,您必须使用timeDifInMilliSec 而不是timeDifSec。你的代码返回你sdf.format(new Date(0).getTime() + timeDifInMilliSec)@MarcC
    • 我将 timeDifSec 更改为 timeDifInMillisec 并将 sdf.format(date) 更改为 sdf.format(new Date(0)) 但它返回我 1:00:00,而不是正确的值 4:05: 06 @afzalex
    • 你一定是在开玩笑。 1:00:00 只能在您的 GMT 时区差为 0.@MarcC 时返回。我正在编辑我的答案并从我的位置添加输出。
    【解决方案3】:

    您创建了一个日期 1970-01-01 04:05:06 GMT,它会转移到您当前的时区。要么自己格式化时差,要么更好地使用 Joda Time 库。

    使用来自 Joda Time 的 Period 类。 Docs here

    您的代码:

       public String getTimeDiff() {
          DateTime start = new DateTime(2014, 3, 28, 8, 30, 00);
          DateTime end = new DateTime(2014, 3, 28, 12, 35, 06);
          Period period = new Period(start, end);
          return PeriodFormat.getDefault().print(period);
      }
    

    返回:4 hours, 5 minutes and 6 seconds

    【讨论】:

      猜你喜欢
      • 2012-10-23
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多