Java 总是在下一刻钟结束

Java 总是在下一刻钟结束,java,Java,我们有一个Java代码的四分之一分钟的要求,例如: 如果当前日期时间为2020-05-28810:01:00 然后,四舍五入到下一季度,使其成为2020-05-28 10:15:00 如果当前日期时间为2020-05-28810:15:01 然后,四舍五入到下一季度,使其成为2020-05-28 10:30:00 如果当前日期时间为2020-05-28 10:46:15 然后,汇总到下一季度,使其成为2020-05-28 11:00:00 如果当前日期时间为2020-12-31T23:47:00

我们有一个Java代码的四分之一分钟的要求,例如:

  • 如果当前日期时间为2020-05-28810:01:00 然后,四舍五入到下一季度,使其成为2020-05-28 10:15:00

  • 如果当前日期时间为2020-05-28810:15:01 然后,四舍五入到下一季度,使其成为2020-05-28 10:30:00

  • 如果当前日期时间为2020-05-28 10:46:15 然后,汇总到下一季度,使其成为2020-05-28 11:00:00

  • 如果当前日期时间为2020-12-31T23:47:00 然后,四舍五入到下一季度,使其成为2021-01-01T00:00:00

  • 有人能提供Java代码来实现这一点吗。感谢您的帮助


    尝试了以下代码,但无法获得我正在查找的输出:

    import java.util.Calendar;
    import java.util.Date;
    
        public class Main {
            public static void main(String[] args) {
                Calendar calendar = Calendar.getInstance();
                calendar.setTime(new Date());
                int round = calendar.get(Calendar.MINUTE) % 15;
                calendar.add(Calendar.MINUTE, round < 8 ? -round : (15-round));
                calendar.set( Calendar.SECOND, 0 );
                System.out.println(calendar.getTime());
            }
        }
    
    import java.util.Calendar;
    导入java.util.Date;
    公共班机{
    公共静态void main(字符串[]args){
    日历=Calendar.getInstance();
    calendar.setTime(新日期());
    int round=calendar.get(calendar.MINUTE)%15;
    日历。添加(日历。分钟,轮数<8?-轮数:(15轮));
    calendar.set(calendar.SECOND,0);
    System.out.println(calendar.getTime());
    }
    }
    
    您可以尝试下面的代码

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date(1609438620000l));
        int fraction = calendar.get(Calendar.MINUTE) / 15;
        switch (fraction) {
        case 0: {
            calendar.set(Calendar.MINUTE, 0);
            break;
        }
        case 1: {
            calendar.set(Calendar.MINUTE, 15);
            break;
        }
        case 2: {
            calendar.set(Calendar.MINUTE, 30);
            break;
        }
        default: {
            calendar.set(Calendar.MINUTE, 45);
            break;
        }
        }
        calendar.add(Calendar.MINUTE, 15);
        calendar.set(Calendar.SECOND, 0);
        System.out.println(calendar.getTime());
    

    这可以使用包中的类轻松完成,您无论如何都应该使用该类1

    这个包含模数运算符的计算确保我们得到了要添加到下一个完整季度的分钟数。
    truncatedTo(ChronoUnit.MINUTES)
    调用会依次确保小于“MINUTES”的所有字段都设置为零

    更新:我不确定您的确切用例,但是,正如巴兹尔指出的,如果您想在时间线上表示某个时刻,那么您还需要一个时区或偏移量。这可以通过在上述方法中将
    LocalDateTime
    实例替换为
    ZonedDateTime
    来实现



    1
    日期
    日历
    简化格式
    类已过时。它们可能在简单的情况下工作,但在更复杂的情况下会造成麻烦。请参阅。

    请发布您迄今为止编写的代码,堆栈溢出不是免费编写代码的服务;)你必须表现出一些努力!我不明白这个问题吗?因为我是Java新手。。。所以请求帮助。。但是我用Java codeFYI编辑了我的问题,有严重缺陷的日期时间类,如,和
    Java.text.simpleDataFormat
    ,现在被Java 8和更高版本中内置的类所取代。感谢您的快速响应。但是我发现MyClass.java在尝试运行代码时使用或覆盖了一个不推荐的API错误。有什么建议吗?您可以取消显示警告。在方法顶部添加以下行。@SuppressWarnings(“弃用”)我已使用日历更新了我的答案,因为您已经在使用它。希望它能帮上忙谢谢它在工作但下面我得到了:输入:2020-05-30T17:57:07输出:2020-05-30T18:00:07预期输出应该是2020-05-30T18:00:00您是否错过了
    calendar.set(calendar.SECOND,0)?C:\Users******\javaCode\ProcessDefinitionJavaCode.java:35:错误:找不到符号int-MinutesLoadd=15-(now.getMinutes()%15);^symbol:method getMinutes()location:variable now的类型为LocalDateTime 1 error它是
    getMinute
    而不是
    getMinutes
    。它是Jre 1.8,奇怪的是只有ow.getMinutes()引起问题。当我试着在下面看看是否有错误发生在其他事情上时,但下面的工作很好,没有错误。是的,导入了LocalDateTime。LocalDateTime newTime=now.plusMinutes(1).truncatedTo(ChronoUnit.MINUTES);谢谢你的帮助:。你知道如何得到某个变量的输出吗。当我试图转换时,它抛出了一个错误:不兼容的类型:LocalDateTime无法转换为DateGood Answer,除了我想不出调用
    LocalDateTime.now()
    是正确的做法之外,因为该类不能代表一个时刻。我建议换成。看到这样。
    public static LocalDateTime roundUpToQuarter(LocalDateTime datetime) {
        int minutesToAdd = 15 - (datetime.getMinute() % 15);
        return datetime
            .plusMinutes(minutesToAdd)
            .truncatedTo(ChronoUnit.MINUTES);
    }