当前位置:   article > 正文

Java技巧_java calendar.set

java calendar.set

目录

日期类

计算时间差(LocalDateTime)

遍历某段日期

大数据处理 

常用数学技巧和基础 

快速幂

最大公约数和最小公倍数

进制转换

求质数


日期类

蓝桥杯比赛中经常出现的有关日期问题的题目,通常需要大量的代码判断日期,非常不方便。Java为我们封装好了日历类Calender省去了大量的代码编写,使用该类能够让日期问题变得十分简单~

创建Calender实例

使用 Calender 的工厂方法 :Calender.getInstance()获取Calender实例:

  1. public static void main(String[] args) throws IOException {
  2. Calendar calendar = Calendar.getInstance();
  3. }

Calender类字段说明

Calender字段需要额外注意,有的字段常量值与日常使用有所区别:

上面标记为红色的字段,一定要注意与现实生活中使用的不同。

设置Calender时间

Calendar 中 set 和 get 时间都是通过在参数中填入不同的字段来实现的,

这里设置时间为**2001年10月23日12时12分12秒** 举例说明

  1. public static void main(String[] args) throws IOException {
  2. Calendar calendar = Calendar.getInstance();
  3. calendar.set(Calendar.YEAR, 2001);
  4. // 月份需要注意对应!!
  5. calendar.set(Calendar.MONTH, 9);
  6. calendar.set(Calendar.DATE, 23);
  7. calendar.set(Calendar.HOUR_OF_DAY, 12);
  8. calendar.set(Calendar.MINUTE, 12);
  9. calendar.set(Calendar.SECOND, 12);
  10. }

同时按照代码执行的顺序,位于后方日历的设置会覆盖前面日历的设置,就例如:

  1. public static void main(String[] args) throws IOException {
  2. Calendar calendar = Calendar.getInstance();
  3. // 前面修改年份的设置
  4. calendar.set(Calendar.YEAR, 2001);
  5. calendar.set(Calendar.MONTH, 9);
  6. calendar.set(Calendar.DATE, 23);
  7. calendar.set(Calendar.HOUR_OF_DAY, 12);
  8. calendar.set(Calendar.MINUTE, 12);
  9. calendar.set(Calendar.SECOND, 12);
  10. calendar.set(Calendar.WEEK_OF_YEAR, 3);
  11. // 一个修改年份的设置
  12. calendar.set(Calendar.YEAR,2021 );
  13. System.out.println(calendar.getTime());
  14. }

运行出来的结果为:

Mon Jan 11 12:12:12 CST 2021

Calender获取值

  1. public static void main(String[] args) throws IOException {
  2. Calendar calendar = Calendar.getInstance();
  3. calendar.get (Calendar.YEAR);//年
  4. calendar.get (Calendar.MONTH) + 1;//月 ,1月对应0,2月对应1,因此需要+1
  5. calendar.get (Calendar.DATE);//日
  6. calendar.get (Calendar.HOUR_OF_DAY);//时
  7. calendar.get (Calendar.MINUTE);//分
  8. calendar.get (Calendar.SECOND);//秒
  9. calendar.get (Calendar.DAY_OF_WEEK);//星期,周日是1,剩下自己推算)
  10. }

计算时间差(LocalDateTime)

  1. /**
  2. * @param args 两个日期相差的天数
  3. * 求2022-2-1到2022-3-1相差的天数
  4. * 求两个日期的时间差(可以以天、小时、分钟、秒为单位输出)
  5. */
  6. public static void main3(String[] args) {
  7. LocalDateTime time1 = LocalDateTime.of(2022, 2, 1, 0, 0);
  8. LocalDateTime time2 = LocalDateTime.of(2022, 3, 1, 0, 0);
  9. long result = Duration.between(time1, time2).toDays(); // 28
  10. LocalDateTime time3 = LocalDateTime.of(2022,5,13,13,13,59,23);
  11. LocalDateTime time4= LocalDateTime.of(2022,5,14,13,13,59,23);
  12. int res = (int) Duration.between(time3,time4).toMinutes();
  13. }

遍历某段日期

  1. /**
  2. * @param args 遍历某段日期的每一天
  3. *
  4. * 遍历2022-01-01到2022-03-01这段日期中的每一天
  5. *
  6. * 例题:跑步锻炼
  7. * 正常情况下,小蓝每天跑 1 千米.如果某天是周一或者月初(1 日),为了激励自己,小蓝要跑 2 千米.
  8. * 如果同时是周一或月初,小蓝也是跑 2 千米.
  9. * 小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年 10 月 1 日周四(含).
  10. * 请问这段时间小蓝总共跑步多少千米?
  11. */
  12. public static void main4(String[] args) {
  13. Calendar c = Calendar.getInstance();
  14. c.set(Calendar.YEAR, 2000);
  15. c.set(Calendar.MONTH, 0);
  16. c.set(Calendar.DAY_OF_MONTH, 1);
  17. int res = 0;
  18. for(;;){
  19. if(c.get(Calendar.DAY_OF_WEEK) == 2 || c.get(Calendar.DATE) == 1){
  20. res += 2;
  21. }else{
  22. res += 1;
  23. }
  24. if(c.get(Calendar.YEAR) == 2020 && c.get(Calendar.MONTH) == 9 &&
  25. c.get(Calendar.DAY_OF_MONTH) == 1){
  26. break;
  27. }
  28. c.add(Calendar.DATE, 1);//天数自增1
  29. }
  30. System.out.println(res);
  31. }
  32. /**
  33. * 方法二:模拟
  34. */
  35. static int[] M = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  36. public void paobu() {
  37. int y = 2000, m = 1, d = 1, w = 6, ans = 0;
  38. while (y != 2020 || m != 10 || d != 1) {
  39. if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)) {//判断闰年
  40. M[2] = 29;
  41. } else {
  42. M[2] = 28;// M是全局变量
  43. }
  44. d++;
  45. w = (w + 1) % 7;// w为0为星期天
  46. if (d > M[m]) {
  47. d = 1;
  48. m++;
  49. }
  50. if (m > 12) {
  51. m = 1;
  52. y++;
  53. }
  54. if (d == 1 || w == 1) {
  55. ans++;// 是月初或者周一多加一次
  56. }
  57. ans++;
  58. }
  59. // 这个循环是先加值再加日期,所以2020.10.1号的已经加上去了,但是2000.1.1没加上,所以加2
  60. ans += 2;
  61. System.out.println(ans);// 8879
  62. }
  1. /**
  2. * 1999年12月31日是星期五,请问:未来哪一个离我们最近的一个世纪末年(即XX99年)的12月31日
  3. * 正好是星期天?回答年份
  4. */
  5. public void judgeYear() {
  6. // 注意Calendar实例的获取方式
  7. Calendar calendar = Calendar.getInstance();
  8. for (int year = 1999; year < 10000; year += 100) {
  9. // 设置年月日
  10. calendar.set(Calendar.YEAR, year);
  11. calendar.set(Calendar.MONTH, 11);// 其实是12月
  12. calendar.set(Calendar.DAY_OF_MONTH, 31);
  13. if (calendar.get(Calendar.DAY_OF_WEEK) == 1) {
  14. // sunday是第一天,所以为1时是Sunday,通过源码查看
  15. System.out.println(year);// 2299
  16. break;
  17. }
  18. }
  19. }

判断闰年

(四年一闰 && 百年不全闰)|| 四百年又闰。

if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {

大数据处理 

你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第 1个棋盘格放 1 粒麦子,在第 2 个棋盘格放 2 粒麦子,在第 3 个棋盘格放 4 粒麦子,在第 4 个棋盘格放 8 粒麦子,......后一格的数字是前一格的两倍,直到放完所有棋盘格(国际象棋共有 64 格)。

国王以为他只是想要一袋麦子而已,哈哈大笑。

当时的条件下无法准确计算,但估算结果令人吃惊:即使全世界都铺满麦子也不够用!

请你借助计算机准确地计算,到底需要多少粒麦子。

  1. public static void main(String[] args) {
  2. BigInteger a = new BigInteger("1");
  3. BigInteger b = new BigInteger("2");
  4. BigInteger res = new BigInteger("1");
  5. for (int i = 2; i <= 64; i++) {
  6. a = a.multiply(b);
  7. res = res.add(a);
  8. }
  9. System.out.println(res);//18446744073709551615
  10. System.out.println(Integer.MAX_VALUE);//2147483647
  11. }

数列求值

给定数列 1, 1, 1, 3, 5, 9, 17,……从第 4 项开始,每项都是前 3 项的和。 求第 20190324 项的最后 4 位数字。

  1. public static void main(String[] args) {
  2. int a = 1;
  3. int b = 1;
  4. int c = 1;
  5. int d = 0;
  6. for (int i = 4; i <= 20190324; i++) {
  7. d = a + b + c;
  8. d = d % 10000;
  9. a = b;
  10. b = c;
  11. c = d;
  12. }
  13. System.out.println(d);//4659
  14. }

常用数学技巧和基础 

快速幂


虽然可以使用Java数学包下的Math.pow方法来求出x的n次幂的值,但这个函数本身运行起来是非常耗时的;对于需要参加竞赛的,无疑会在超时的边缘徘徊,而快速幂可以通过将指数拆分成多个因数相乘的形式来简化幂运算,大大调高运算效率!

  1. public double myPow(double x, int n) {
  2. double result = 1;
  3. long v = n;// 为了保证-n不溢出,先转换成long类型
  4. if(v < 0) {// 如果v小于0, 求1/x的-v次方
  5. x = 1 / x;
  6. v = -v;
  7. }
  8. while(v > 0) {
  9. if((v & 1) == 1) {//此处等价于if(v % 2 == 1)
  10. result *= x;
  11. }
  12. v >>= 1;//此处等价于v = v / 2
  13. x *= x;
  14. }
  15. return result;
  16. }

最大公约数和最小公倍数

蓝桥杯的数据量是出名的大(这个后面会体现),超时是肯定的。
背下欧几里得公式直接使用(已知效率最快求出公倍数地公式)

  1. /**
  2. * gcd函数(欧几里得算法原理)
  3. * @return 返回值则是a和b的最大公约数
  4. */
  5. public static int gcd(int a,int b){
  6. return b == 0 ? a : gcd(b,a % b);
  7. }
  8. /**
  9. * lcm函数(速求最小公倍数,原理基于gcd函数)
  10. * @return 返回值为a和b的最小公倍数
  11. */
  12. public static int lcm(int a, int b){
  13. return (a * b) / gcd(a,b);//最小公倍数 = 两数之积 ÷ 两数最大公约数
  14. }

进制转换

  1. public static void conversion(){
  2. //n进制转为十进制
  3. System.out.println(Integer.valueOf("1111",2));//15
  4. System.out.println(Integer.valueOf("ffff",16));//65535
  5. //十进制转为n进制
  6. System.out.println(Integer.toString(128,2));//10000000
  7. System.out.println(Integer.toString(15,16));//f
  8. }

求质数

1.判断一个数是否是质数

  1. private static boolean isPrime(int n){
  2. int i = 2;
  3. for(i = 2;i <= Math.sqrt(n);i++){
  4. //只要模一次是0,就不是素数
  5. if(n % i == 0){
  6. return false;
  7. }
  8. }
  9. return i > Math.sqrt(n);//是素数
  10. }

2.求n下有多少个质数

埃筛法
埃筛法是能够快速筛选出质数的方法之一,在众多质数筛选方法中,埃筛法虽然不是最快的方法,但绝对是最容易理解的方法。
原理:从小到大开始筛选质数,当某个数被认定为质数时,那么后面能够被该数整除的数就一定不是质数,为这些数增加一个标记,当遍历到这些被标记的数时,直接跳过即可,无需再为其执行检验是否为质数的操作,因为判断一个数是否为质数是筛选质数过程中最耗时的操作,而埃筛法则能大幅度的减少该操作的执行频率,从而提高素数筛选的效率。

  1. public static void prime(int n) {
  2. boolean[] flag = new boolean[n + 1];
  3. for(int i = 2; i <= n; i++) {
  4. if(flag[i]){
  5. continue;
  6. }
  7. System.out.print(i + " ");
  8. for(int j = i; i * j <= n; j++) {
  9. flag[i * j] = true;
  10. }
  11. }
  12. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/549347
推荐阅读
相关标签
  

闽ICP备14008679号