Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以秒为单位的循环时间_Java_Date_Rounding_Jodatime - Fatal编程技术网

Java 以秒为单位的循环时间

Java 以秒为单位的循环时间,java,date,rounding,jodatime,Java,Date,Rounding,Jodatime,在我的Java项目中,我想要整数日期时间秒除以5 I have got - I want 12:00:01 - 12:00:00 12:00:04 - 12:00:05 12:00:06 - 12:00:05 12:00:07 - 12:00:05 12:00:08 - 12:00:10 ... 12:00:58 - 12:01:00 日期对象包含日期,例如:2017年5月12日星期五12:00:03 CEST 我想要四舍

在我的Java项目中,我想要整数日期时间秒除以5

I have got   -   I want 
 12:00:01    -  12:00:00
 12:00:04    -  12:00:05
 12:00:06    -  12:00:05
 12:00:07    -  12:00:05
 12:00:08    -  12:00:10
 ...
 12:00:58    -  12:01:00
日期对象包含日期,例如:2017年5月12日星期五12:00:03 CEST 我想要四舍五入的秒数。我想实现日期对象与四舍五入秒

如何使用简单的数学或Joda实现这一点?

这里有一个建议:

    LocalTime time = LocalTime.now(ZoneId.systemDefault()).truncatedTo(ChronoUnit.SECONDS);
    System.out.println("Before rounding: " + time);
    int secondsSinceLastWhole5 = time.getSecond() % 5;
    if (secondsSinceLastWhole5 >= 3) { // round up
        time = time.plusSeconds(5 - secondsSinceLastWhole5);
    } else { // round down
        time = time.minusSeconds(secondsSinceLastWhole5);
    }
    System.out.println("After rounding: " + time);
输出示例:

Before rounding: 14:46:33
After rounding: 14:46:35

Before rounding: 14:47:37
After rounding: 14:47:35
%5模5运算将给出自时钟上最后一整5秒以来的秒数,作为间隔0到4的数字。利用这一点,我们就知道该走哪条路了


我正在使用java.time.LocalTime。对于今天没有明确时区的时代,这是推荐的课程。

作为Ole V.V正确答案的补充:

据我所知,但其他人可能会纠正我,Joda Time提供了但不是OP想要的类型,即这里的可配置步长:5秒。因此,我怀疑Joda解决方案与基于Java-8的@Ole给出的解决方案非常相似

My time library具有更多舍入功能,无需考虑舍入数学,如下代码所示:

import net.time4j.ClockUnit;
import net.time4j.PlainTime;

import net.time4j.format.expert.Iso8601Format;

import java.text.ParseException;
import java.time.LocalTime;

import static net.time4j.PlainTime.*;

public class RoundingOfTime {

    public static void main(String... args) throws ParseException {
        PlainTime t1 = Iso8601Format.EXTENDED_WALL_TIME.parse("12:59:57");
        PlainTime t2 = Iso8601Format.EXTENDED_WALL_TIME.parse("12:59:58");

        System.out.println(t1.with(SECOND_OF_MINUTE.roundedHalf(5))); // T12:59:55
        System.out.println(t2.with(SECOND_OF_MINUTE.roundedHalf(5))); // T13

        LocalTime rounded =
            PlainTime.nowInSystemTime()
            .with(PRECISION, ClockUnit.SECONDS) // truncating subseconds
            .with(SECOND_OF_MINUTE.roundedHalf(5)) // rounding
            .toTemporalAccessor(); // conversion to java-time
        System.out.println(rounded); // 15:57:05
    }
}

该方法适用于类PlainTime中定义的大多数时间元素。我欢迎进一步的改进建议,甚至可能找到一种方法来定义这种临时调整器。

到目前为止,您尝试了什么?你看,这不是一个你放弃要求我们放弃代码的服务。我希望舍入时间为每5秒。这不可能开箱即用,你必须自己做舍入,但这或多或少是一个简单的切换情况。JodaTime的可能副本确实有舍入功能,但不是你想要的那种特殊舍入功能。因此,Joda解决方案不会比您在java-8中接受的基于java.time-package的解决方案更容易。要获得更简单、更简短的解决方案,您还可以查看我的库,它提供了这种专门的舍入方法,请参见此。它运行良好:没有Joda方法对其进行舍入?必须手动完成吗?我应该从一开始就清楚我使用的是java.time,而不是JodaTime。这门课被称为同一门课并不奇怪。您可以像我在第一行代码中所做的那样,将java.time.LocalTime截断为整个时间单位,但不能截断为整个5秒。我不知道JodaTime的版本。有什么特别的原因让你更喜欢JodaTime而不是java.time吗?今天,他们说“现在要求用户迁移到java.time JSR-310。”我从阅读中得到的印象是,java.time通常至少也一样好,尽管在某些情况下,JodaTime提供了java.time中尚未提供的函数。如果您还没有使用Java 8或更高版本,您可以使用JSR-310的Three-Ten类,或者在我的lib Time4J中更简单:LocalTime rounded=PlainTime.fromtime.withSECOND_OF_MINUTE.roundedHalf5.toTemporalAccessor;