【问题标题】:Groovy: TimeDuration - Custom Output FormatGroovy:TimeDuration - 自定义输出格式
【发布时间】:2014-02-21 17:48:41
【问题描述】:

我正在尝试在没有默认字段名称的情况下消除常规的持续时间,即天、小时、分钟、秒等。

这个格式化的时间差被放在进度条的末尾,以便显示进程的实时运行时间。

public static String calculateTime(Date timeStart)
{
        Date timeStop = new Date()
        TimeDuration duration = TimeCategory.minus(timeStop, timeStart)
        return "${duration.days}:${duration.hours}:${duration.minutes}:${duration.seconds}".toString()
        //return duration.toString()
}


public static void printProgBar(long num, long den, Date startDate){
    def bar = "[";
        DecimalFormat df = new DecimalFormat("#.00");
        def dataType = "";

        def len = den.toString().length()

        if(den == 0)
        {
                den = 1;
        }

        BigDecimal percent = ((num/den)*100)

        if(len <= 3){ dataType = "bytes" }
        if(len <= 6 && len > 3){ dataType = "Kbs" }
        if(len <= 9 && len > 6){ dataType = "Mbs" }
        if(len <= 12 && len > 9){ dataType = "Gbs" }

        def n = num
        def d = den
        if(dataType.equals("Kbs"))
        {
            n = num/1024
            d = den/1024
        }
        if(dataType.equals("Mbs"))
        {
            n = num/1024/1024
            d = den/1024/1024
        }
        if(dataType.equals("Gbs"))
        {
            n = num/1024/1024/1024
            d = den/1024/1024/1024
        }

    for(int i = 0; i < 50; i++){
        if( i < (percent/2)){
            bar += "|";
        }else if( i == (percent/2)){
            bar += ">";
        }else{
            bar += " ";
        }
    }

    def message = (percent == 100) ? "Complete!" : "processed..."

    bar += "]   " + df.format(percent) + "%    " + df.format(n) + " of " + df.format(d) + " $dataType $message " + HSTools.calculateTime(startDate);
    print "\r" + bar;
}

输出:

加载数据:Patient_Contacts_Data.txt 创建扫描器并设置分隔符:\|^@*^@r^@*^@\| [||||||||||||||||||||||||||||||||||||||||||||||| |] 100.00% 1.60 of 1.60 Mbs 完成! 0:0:0:5656 处理的记录:5857 经过时间:0:0:0:56

在大多数情况下,我的代码似乎可以正常工作,但有时秒数似乎会增加一倍。

对可能导致这种情况的任何想法?或者关于如何更好地格式化这个 TimeDuration 的建议?

【问题讨论】:

  • 什么是 HSTools?输出格式为HSTools.calculateTime(startDate),这可能是您应该开始查找的地方。
  • HSTools.calculateTime() 是上面代码中列出的第一个函数。您可以看到那里的格式设置是 ${duration.days}:${duration.hours}:${duration.minutes}:${duration.seconds} 应该产生 0:0:0:0 的输出(天,小时,分钟,秒)

标签: datetime grails groovy timer duration


【解决方案1】:

您的代码的问题是之前的输出没有被删除。由于您的输出未格式化为固定大小,因此稍后出现的较短输出不会覆盖先前输出中的最后一个字符。

例如,当持续时间从 59 秒变为 1 分钟时,它会发生如下变化:

[|||||||||||||||||           ]   59.10%    .58 of .98 Kbs processed... 0:0:0:59

到这样的事情:

[|||||||||||||||||           ]   59.20%    .58 of .98 Kbs processed... 0:0:1:0

但由于第一行比第二行长,实际输出会是这样的:

[|||||||||||||||||           ]   59.20%    .58 of .98 Kbs processed... 0:0:1:09

您可以通过添加一些空格来解决它,或者通过制作固定大小的时间输出(例如,始终使用 2 位数字表示秒、分钟、小时等)。

注意:在 IntelliJ IDEA 中运行时,行的剩余部分实际上已被删除,但在 shell 中运行时却没有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 2020-02-21
    相关资源
    最近更新 更多