java计算下一个整5分钟时间点

需求:需要获取当前时间的下一个整点时间,如13:23,获取的下一个时间为 13:25
代码:

/**
     * 获取下一个分钟值以0或者5结尾的时间点(单位:毫秒)
     * @return
     */
    public static long getNextMillisEndWithMinute0or5(Date baseTime) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(baseTime);
        int minute = calendar.get(Calendar.MINUTE);
        if (minute < 55) {
            System.out.println(minute%10 + "===" + (5 - minute%10) + "===" + (10 - minute%10));
            int add = minute%10 < 5 ? 5 - minute%10 : 10 - minute%10;
            calendar.add(Calendar.MINUTE, add);
            calendar.set(Calendar.SECOND, 0);
            calendar.set(Calendar.MILLISECOND, 0);
            return calendar.getTime().getTime();
        }
        // 当前时间+1小时
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        calendar.add(Calendar.HOUR_OF_DAY, 1);
        return calendar.getTime().getTime();
    }

测试代码:

@Test
    public void timeEndWithMinute0or5() throws ParseException {
        final String format = "yyyy-MM-dd HH:mm:ss";
        DateFormat dF = new SimpleDateFormat(format);
        long next = getNextMillisEndWithMinute0or5(new Date());
        System.out.println(DateFormatUtils.format(next, format));

        long test1 = getNextMillisEndWithMinute0or5(dF.parse("2020-07-10 11:00:00"));
        Assert.assertEquals("2020-07-10 11:05:00", DateFormatUtils.format(test1, "yyyy-MM-dd HH:mm:ss"));

        long test2 = getNextMillisEndWithMinute0or5(dF.parse("2020-07-10 11:35:00"));
        Assert.assertEquals("2020-07-10 11:40:00", DateFormatUtils.format(test2, "yyyy-MM-dd HH:mm:ss"));

        // 跨小时
        long test3 = getNextMillisEndWithMinute0or5(dF.parse("2020-07-10 12:59:59"));
        Assert.assertEquals("2020-07-10 13:00:00", DateFormatUtils.format(test3, "yyyy-MM-dd HH:mm:ss"));

        // 跨天
        long test4 = getNextMillisEndWithMinute0or5(dF.parse("2020-07-10 23:59:59"));
        Assert.assertEquals("2020-07-11 00:00:00", DateFormatUtils.format(test4, "yyyy-MM-dd HH:mm:ss"));

        // 跨闰月
        long test5 = getNextMillisEndWithMinute0or5(dF.parse("2020-02-29 23:55:59"));
        Assert.assertEquals("2020-03-01 00:00:00", DateFormatUtils.format(test5, "yyyy-MM-dd HH:mm:ss"));

        // 跨闰年
        long test6 = getNextMillisEndWithMinute0or5(dF.parse("2019-12-31 23:55:59"));
        Assert.assertEquals("2020-01-01 00:00:00", DateFormatUtils.format(test6, "yyyy-MM-dd HH:mm:ss"));
    }

参考文章:java计算下一个整5分钟时间点 - 极客子羽 - 博客园

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 以下是Java代码实现: ```java import java.util.Scanner; public class Calendar { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入年份:"); int year = scanner.nextInt(); // 计算该年第一天是星期几 int firstDayOfWeek = getFirstDayOfWeek(year); // 逐月打印日历 for (int i = 1; i <= 12; i++) { printMonth(year, i, firstDayOfWeek); // 计算下个月的第一天是星期几 firstDayOfWeek = (firstDayOfWeek + getDaysOfMonth(year, i)) % 7; } } // 获取某个月的天数 private static int getDaysOfMonth(int year, int month) { int[] days = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; if (month == 2 && isLeapYear(year)) { return 29; } return days[month - 1]; } // 判断是否为闰年 private static boolean isLeapYear(int year) { return year % 4 == 0 && year % 100 != 0 || year % 400 == 0; } // 获取某年第一天是星期几 private static int getFirstDayOfWeek(int year) { int day = 1; for (int i = 1900; i < year; i++) { if (isLeapYear(i)) { day = (day + 366) % 7; } else { day = (day + 365) % 7; } } return day; } // 打印某个月的日历 private static void printMonth(int year, int month, int firstDayOfWeek) { System.out.printf("%d年%d月\n", year, month); System.out.println("日 一 二 三 四 五 六"); // 打印该月第一天之前的空格 for (int i = 0; i < firstDayOfWeek; i++) { System.out.print(" "); } // 打印该月每一天的日期 for (int i = 1; i <= getDaysOfMonth(year, month); i++) { System.out.printf("%2d ", i); if ((firstDayOfWeek + i) % 7 == 0) { System.out.println(); } } // 换行 System.out.println(); } } ``` 运行程序后,输入年份,即可打印该年的万年历。 ### 回答2: 编写一个万年历,能够根据输入的年打印一整年的日历情况的Java代码如下: ```java import java.util.Scanner; public class CalendarPrinter { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("请输入年份:"); int year = input.nextInt(); printCalendar(year); } public static void printCalendar(int year) { int days = getDaysOfYear(year); int startDay = getStartDay(year); String[] months = {"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"}; for (int month = 0; month < months.length; month++) { System.out.println(months[month]); System.out.println("日 一 二 三 四 五 六"); int dayCount = 1; for (int i = 0; i < startDay; i++) { System.out.print(" "); dayCount++; } for (int day = 1; day <= daysInMonth(year, month + 1); day++) { System.out.printf("%2d ", day); dayCount++; if (dayCount > 7) { System.out.println(); dayCount = 1; } } System.out.println("\n"); startDay = (startDay + daysInMonth(year, month + 1)) % 7; } } public static int getDaysOfYear(int year) { if (isLeapYear(year)) { return 366; } else { return 365; } } public static int getStartDay(int year) { int startDay1800 = 3; // 1800年1月1日为星期三 int totalDays = 0; for (int i = 1800; i < year; i++) { if (isLeapYear(i)) { totalDays += 366; } else { totalDays += 365; } } return (startDay1800 + totalDays) % 7; } public static int daysInMonth(int year, int month) { int[] daysInMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; if (month == 2 && isLeapYear(year)) { return 29; } else { return daysInMonth[month - 1]; } } public static boolean isLeapYear(int year) { if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) { return true; } else { return false; } } } ``` 这段代码中,我们首先输入一个年份,然后调用`printCalendar`函数打印该年份的日历。在`printCalendar`函数中,我们使用循环遍历每个月,然后根据每个月的天数和起始星期计算并打印每个月的日历。需要注意的是,我们使用了`getDaysOfYear`函数来获取一年的总天数,使用`getStartDay`函数来获取指定年份的1月1日是星期几,使用`daysInMonth`函数来获取每个月的天数,以及使用`isLeapYear`函数来判断指定年份是否为闰年。 ### 回答3: 编写一个万年历程序,可以根据输入的年份打印出该年的整个日历。 首先,我们可以定义一个方法,该方法接受输入的年份作为参数。在该方法中,我们可以使用循环来遍历一整年的所有月份。 在每个月份的循环中,我们可以利用Java的日期和时间库(如java.time包)来计算该月的第一天是星期几。然后,在打印日历之前,我们可以根据第一天的星期计算出每个月份第一天之前应该显示的空格数量。 接下来,我们可以使用两个嵌套循环来打印该月份的所有日期。第一个循环将打印星期几的标签,而第二个循环将打印日期数字。这里我们需要注意,当日期为1时,需要判断是否需要打印空格来对齐。 最后,我们可以在该方法中调用上述逻辑,完成整个年份的日历打印。 以下是一个简化的示例代码: ```java import java.time.DayOfWeek; import java.time.LocalDate; public class Main { public static void main(String[] args) { printCalendar(2022); } public static void printCalendar(int year) { for (int month = 1; month <= 12; month++) { LocalDate date = LocalDate.of(year, month, 1); DayOfWeek firstDayOfWeek = date.getDayOfWeek(); System.out.println("\n----- " + date.getMonth() + " -----"); System.out.println("Mon Tue Wed Thu Fri Sat Sun"); for (int i = 1; i < firstDayOfWeek.getValue(); i++) { System.out.print(" "); // 打印空格 } int daysInMonth = date.lengthOfMonth(); int dayOfWeek = firstDayOfWeek.getValue(); for (int day = 1; day <= daysInMonth; day++) { System.out.printf("%3d ", day); // 打印日期 if (dayOfWeek == 7) { System.out.println(); dayOfWeek = 1; } else { dayOfWeek++; } } } } } ``` 以上是一个简单的万年历打印程序的实现。可以根据输入的年份,打印出该年的整个日历。请注意,此示例未考虑闰年的情况,以及对齐和美观的调整。实际应用中可能需要更多的逻辑处理和样式美化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值