蓝桥杯题目 19730 神奇闹钟
题目:
问题描述
小蓝发现了一个神奇的闹钟,从纪元时间(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
//API是工具类
//java时间API:表示一套处理日期和时间发工具类,在java.time包里面
/*
核心类:LocalDateTime对象
表示没有时区的日期时间,比如 2023-05-08 14:30:00(和有时区的对比 2023-05-08T14:30:00+08:00[Asia/Shanghai])DateTimeFormatter-格式化:用于日期时间和字符串的相互转换
DateTimeFormatter formatter=DateTimeFormatter.ofPattern("yyy-MM-dd HH:mm:ss");
*/import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;public class SimpleAlarmWithNewAPI {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int T = scanner.nextInt();scanner.nextLine(); // 读取换行符// 创建格式化器:定义输入输出格式//没有格式化器,程序不知道你的时间字符串是什么格式;而且输出时可能也是默认格式DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");for (int i = 0; i < T; i++) {String line = scanner.nextLine();String[] parts = line.split(" ");//通过空格切割,将年月日放在parts[0],时分秒放在parts[1]间隔放在parts[2]// 1. 解析输入时间:把字符串变成LocalDateTime对象String timeStr = parts[0] + " " + parts[1]; //将数组中的 年月日 时分秒再组合在一起// "2016-09-07 18:24:33"LocalDateTime givenTime = LocalDateTime.parse(timeStr, formatter);//把字符串变成没有时区的日期时间,以formatter的格式// 2. 获取间隔分钟数int x = Integer.parseInt(parts[2]); // 10// 3. 核心计算:转换为时间戳进行计算// 将LocalDateTime转换为从1970年开始的秒数; 把"几月几日几点几分"变成"从起点开始数到第几秒"long totalSeconds = givenTime.toEpochSecond(java.time.ZoneOffset.UTC); //纪元时间1970-01-01 00:00:00本身就是UTC时间;//toEpochSecond转换成纪元开始计算的秒数 ;ZoneOffset 表示时区偏移量,就是某个地区时间与世界统一时间(UTC)的差值。//为什么要选择用java.time.ZoneOffset.UTC 就是在调用toEposhSecond方法时以纪元时间为标准,因为不同时区,表示的时间不一样// 计算间隔秒数long intervalSeconds = x * 60L; // 10分钟 = 600秒 // L 表示这是一个 long 类型的字面值。// 整数除法找到最近的闹铃时间戳long lastAlarmSeconds = (totalSeconds / intervalSeconds) * intervalSeconds;//最近响铃时间=(总时间/间隔)*间隔 ,只是去掉了余数,就是响铃过后多出来的时间
//去掉总时间中不能被间隔整除的"零头"部分// 4. 将时间戳转换回LocalDateTime LocalDateTime.ofEpochSecond 的作用与 toEpochSecond 正好相反://把秒数转换回日期时间对象LocalDateTime alarmTime = LocalDateTime.ofEpochSecond(lastAlarmSeconds, 0, java.time.ZoneOffset.UTC);// 5. 格式化输出System.out.println(alarmTime.format(formatter));//以formatter的格式输出}scanner.close();}
}
这个代码是一点也看不懂,自己结合ai看了一下