日期问题和日期常用API

问题描述

小蓝发现了一个神奇的闹钟,从纪元时间(19701970 年 11 月 11 日 00:00:0000:00:00)开始,每经过 xx 分钟,这个闹钟便会触发一次闹铃 (纪元时间也会响铃)。这引起了小蓝的兴趣,他想要好好研究下这个闹钟。

对于给出的任意一个格式为 уууу-MM-ddHH:mm:ssуууу-MM-ddHH:mm:ss 的时间,小蓝想要知道在这个时间点之前 (包含这个时间点) 的最近的一次闹铃时间是哪个时间?

注意,你不必考虑时区问题。

输入格式

输入的第一行包含一个整数 TT,表示每次输入包含 TT 组数据。

接下来依次描述 TT 组数据。

每组数据一行,包含一个时间(格式为 уууу-MM-ddHH:mm:ssуууу-MM-ddHH:mm:ss)和一个整数 xx,其中 xx 表示闹铃时间间隔(单位为分钟)。

输出格式

输出 TT 行,每行包含一个时间(格式为 уууу-MM-ddHH:mm:ssуууу-MM-ddHH:mm:ss),依次表示每组数据的答案。

样例输入

复制代码
2
2016-09-07 18:24:33 10
2037-01-05 01:40:43 30

样例输出

复制代码
2016-09-07 18:20:00
2037-01-05 01:30:00

评测用例规模与约定

对于所有评测用例,1≤T≤10,1≤x≤10001≤T≤10,1≤x≤1000,保证所有的时间格式都是合法的。

java 复制代码
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime epoch = LocalDateTime.of(1970 , 1 , 1 , 0 , 0 ,  0);
        LocalDateTime[] ans = new LocalDateTime[n];
        for (int i = 0; i < n; i++) {
            String s1 = sc.next();
            String s2 = sc.next();
            long x = sc.nextLong();
            LocalDateTime t1 = LocalDateTime.parse(s1 + " " + s2, df);
            long dif = Duration.between(epoch , t1).toMinutes();
            long neart = dif/x*x;
            ans[i] = epoch.plusMinutes(neart);
        }
        for(LocalDateTime t : ans){
            System.out.println(t.format(df));
        }
    }
}

Java 8 日期 API = 不可变类 = 构造私有 = 不能 new = 必须用静态方法(now/of/parse)

还有很多常用的API,比如获取今天是周几,今天是几号,获取时间差

其中获取时间差

2. Period

  • 算时间(时分秒) → 用 Duration
  • 算日期(年月日) → 用 Period
  • 只想拿相差总天数 → 用 ChronoUnit.DAYS.between(最简单)
    1. ChronoUnit(推荐 ✅)
  • 返回总相差数
  • 比如:2 年 3 个月 → YEARS 给你 2,MONTHS 给你 27
  • 简单、直接、适合业务计算
  • 返回分开的年、月、日
  • 比如:2 年 3 个月 5 天
  • 适合展示 "XX 年 XX 月 XX 日
java 复制代码
public class test1 {
    public static void main(String[] args) {
        LocalDate t1 = LocalDate.of(2023 , 2 , 12);
        LocalDate t2 = LocalDate.of(2024 , 2 , 12);
        System.out.println(Period.between(t1 , t2).getDays());  //结果为0
        System.out.println(Period.between(t1 , t2).getMonths());  //结果为0
        System.out.println(Period.between(t1 , t2).getYears());  //结果为1

        System.out.println(ChronoUnit.DAYS.between(t1 , t2));   //结果为365
        System.out.println(ChronoUnit.MONTHS.between(t1 , t2));   //结果为12
        System.out.println(ChronoUnit.YEARS.between(t1 , t2));   //结果为1
    }
}
相关推荐
Bczheng113 小时前
五.serialize.h中的CDataStream类
算法·哈希算法
小O的算法实验室13 小时前
2025年SEVC,考虑组件共享的装配混合流水车间批量流调度的多策略自适应差分进化算法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
汀、人工智能13 小时前
[特殊字符] 第36课:柱状图最大矩形
数据结构·算法·数据库架构·图论·bfs·柱状图最大矩形
List<String> error_P13 小时前
蓝桥杯最后冲刺(三)
算法
样例过了就是过了13 小时前
LeetCode热题100 跳跃游戏
c++·算法·leetcode·贪心算法·动态规划
无限进步_13 小时前
【C++&string】寻找字符串中第一个唯一字符:两种经典解法详解
开发语言·c++·git·算法·github·哈希算法·visual studio
FluxMelodySun13 小时前
机器学习(二十九) 稀疏表示与字典学习(LASSO算法、KSVD算法、奇异值分解)
人工智能·算法·机器学习
LG.YDX13 小时前
笔试训练48天:跳台阶
数据结构·算法
汀、人工智能13 小时前
[特殊字符] 第42课:对称二叉树
数据结构·算法·数据库架构·图论·bfs·对称二叉树
ZTL-NPU13 小时前
代码随想录-第二章:时间复杂度
数据结构