在java中找出两次之间的差异

时间:2013-01-24 05:27:11

标签: java date grails time date-arithmetic

我有一个搜索按钮,当用户点击搜索按钮时,会调用search()方法。我需要计算在谷歌搜索中看到向用户显示结果所花费的时间。

这是我的代码。

        SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String strDate;
def startTime() { 
    Calendar cal = Calendar.getInstance();
    System.out.println("Current milliseconds since 13 Oct, 2008 are :"
    + cal.getTimeInMillis());
    long startTime=cal.getTimeInMillis();
    /*Date startNow = new Date();
    strDate = sdfDate.format(startNow);
    Date startTime=sdfDate.parse(strDate);
    print "startTime"+startTime*/
    return  startTime;

}
def endTime(){
    Calendar cal = Calendar.getInstance();
    System.out.println("Current milliseconds  :"
    + cal.getTimeInMillis());
    long endTime=cal.getTimeInMillis();
    /*Date endNow = new Date();
    print "endNow"+endNow
    strDate = sdfDate.format(endNow);
    Date endTime=sdfDate.parse(strDate);
    print "endTime"+endTime*/
    return endTime;
}

def differenceTime(long startTime,long endTime){
    print "requestEndTime"+endTime
    print "requestStartTime"+startTime
    long timeDifference = endTime - startTime;
    return timeDifference;
}

这里我试图获取开始时间和结束时间并尝试计算差异。我知道我实施的方式是否正确?请告诉我通常如何计算时差。

4 个答案:

答案 0 :(得分:5)

而不是使用Calendar,而不是使用System.currentTimeMillis()

def startTime() { 
    long startTime=System.currentTimeMillis();
    return  startTime;
}

基于System.currentTimeMillis()计算时差在Java中很常见,你会做得对(我的意思是endTime - startTime

因此,您的代码可能如下所示:

long startTime = System.currentTimeMillis();
// .....
// processing request
// .....
long endTime = System.currentTimeMillis();
long differenceTime = endTime - startTime;
log.debug("Request time: " + differenceTime);
//or
log.debug("Request time: " + TimeUnit.MILLISECONDS.toSeconds(differenceTime) + " sec");

答案 1 :(得分:0)

您可以改用此课程。我在追求Coursera的算法,第一部分课时学到了它。

public class StopWatch {

    /* Private Instance Variables */
    /** Stores the start time when an object of the StopWatch class is initialized. */
    private long startTime;

    /**
     * Custom constructor which initializes the {@link #startTime} parameter.
     */
    public StopWatch() {
        startTime = System.currentTimeMillis();
    }

    /**
     * Gets the elapsed time (in seconds) since the time the object of StopWatch was initialized.
     * 
     * @return Elapsed time in seconds.
     */
    public double getElapsedTime() {
        long endTime = System.currentTimeMillis();
        return (double) (endTime - startTime) / (1000);
    }
}

测试可以完成:

public class SWTest {

    public static void main(String[] args) throws InterruptedException {
        StopWatch stopWatch = new StopWatch();

        Thread.sleep(10000);
        System.out.println(stopWatch.getElapsedTime());
        Thread.sleep(60000);
        System.out.println(stopWatch.getElapsedTime());
    }
}

答案 2 :(得分:0)

你可以这样编码:

LocalDateTime startTIme = LocalDateTime.now();
//Code Here
LocalDateTime endTime = LocalDateTime.now();
System.out.println(Duration.between(startTIme,endTime));

答案 3 :(得分:0)

java.time

避免旧的旧java.util.Date/.Calendar类。在证明设计不佳和麻烦之后,旧的日期时间类已被java.time框架取代。见Tutorial。查看添加到旧类进行转换的新方法。

JSR 310定义。 java.time的大部分功能都是back-ported to Java 6 & 7further adapted to Android

Instant

Instant代表UTC中时间轴上的一个时刻,分辨率最高为nanoseconds

由于依赖于milliseconds旧的预先存在的实施,捕获当前时刻仅限于Clock分辨率;在Java 9中替换为以纳秒为单位捕获当前时刻(取决于计算机的硬件时钟能力)。

Instant start = Instant.now();
…
Instant stop = Instant.now();

Duration

Duration类表示一个时间跨度,以秒为单位加上几分之一秒(纳秒)。

Duration duration = Duration.between( start , stop );

输出

Duration::toString方法使用标准ISO 8601格式生成文本表示。从P开始(对于期间),T将小时 - 月 - 天与小时 - 分 - 秒分开。所以一个半小时是PT1H30M。这种格式避免了01:30含糊不清的意思,即经过时间与时间的关系。

String output = duration.toString();

或者,您可以询问整秒的总数和纳秒的总数。

long seconds = duration.getSeconds();  // Whole seconds.
int nanoseconds = duration.getNano();  // Fraction of a second, maximum of 999,999,999.