今天来吐槽一下Java的Calendar类的使用问题,反正我是弄了半天。

首先是,遇到一个问题,输入年份和月份,需要打印这个月的日历,网上有不少代码,但我用了几个感觉都不是很靠谱。

然后经过一番探索,最后敲定了下面这个程序:

import java.util.Arrays;
import java.util.Calendar;
import java.util.List;
import java.util.Scanner; public class MyCal { public static void main(String[] args) {
try (Scanner sc = new Scanner(System.in)) {
System.out.println("please input the year:");
int year = sc.nextInt();
System.out.println("please input the month:");
int month = sc.nextInt();
List<String> MONTH_LIST = Arrays.asList(
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sept", "Oct", "Nov", "Dec"
);
System.out.printf(" %s, %4d\n", MONTH_LIST.get(month - 1), year);
System.out.println("-----------------------------");
System.out.println(" Sun Mon Tue Wed Thu Fri Sat");
Calendar c = Calendar.getInstance();
c.set(year, month-1, 1);
int totalDay = c.getActualMaximum(Calendar.DATE);
for (int i = 1; i < c.get(Calendar.DAY_OF_WEEK); i++)
System.out.print(" ");
for (int i = 1; i <= totalDay; i++) {
c.set(year, month-1, i);
System.out.printf("%4d", i);
if (c.get(Calendar.DAY_OF_WEEK)==Calendar.SATURDAY)
System.out.println("");
}
}
} }

set(year,month,date)的问题

c.set(year, month-1, 1);

网上的代码真的不靠谱,没几个把API解释清楚的。

我最后还是去翻官方API才发现,第二个参数月份是从0开始的,而第三个参数日期却是从1开始的,着实坑了我一把。

getActualMaximum的用法

int totalDay = c.getActualMaximum(Calendar.DATE);

getActualMaximum方法可以直接获取Calendar中一个字段的最大值,getActualMaximum(Calendar.DATE)的意思就是获取这个月日期的最大值。

还可以这样用:

getActualMaximum(Calendar.MONTH)获取月份的最大值

getActualMaximum(Calendar.HOUR)获取小时数的最大值

是否加get

再说一下c.get(Calendar.DAY_OF_WEEK)和Calendar.DAY_OF_WEEK的区别,加不加get有很大的区别,我一开始也没注意,Calendar内部实现和get的返回值是有偏差的,好像是1。

如果不注意,可能就像我一样,调日期的格式调了半天。

Calendar.DAY_OF_WEEK

Calendar.DAY_OF_WEEK这个函数网上的博客很多也没讲清楚,其实它的功能是获得当前日期是礼拜几。

但是就像上面说的一样,如果外面不套一个get,实际上你获得的和Calendar.SATURDAY是有偏差的,例如Calendar.DAY_OF_WEEK==Calendar.SATURDAY和c.get(Calendar.DAY_OF_WEEK)==Calendar.SATURDAY是不一样的。

程序逻辑

先在循环体外面打印空格,分析一下,应该是填入get(Calendar.DAY_OF_WEEK)个Tab(四个空格)。

循环体里面的逻辑也很简单,每次都重新设置一下日期,从这个月的1号开始设置到最后一天,如果这天正好是星期六,那么下一次就需要换行输出。

测试

最后的结果大概是这样的:

please input the year:
2019
please input the month:
11
Nov, 2019
-----------------------------
Sun Mon Tue Wed Thu Fri Sat
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Java打印日历表的更多相关文章

  1. Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录)

    Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录) 作者:王可利(Star·星星) 效果图: 代码如下: class Star8 { public static void m ...

  2. 关于这两天研究Java打印pdf方法的记录

    这两天在研究Java调用打印机打印PDF文件的方法,学到了不少东西,特别来记录一下. 关于Java打印网上最多的而且也是Java正统的打印方法就是使用PrintService,一套比較标准的打印代码例 ...

  3. java打印正金字塔,倒金字塔和“水影”金字塔

    java打印正金字塔,倒金字塔和"水影"金字塔 --------原创文章,若要转载,请注明出处   小小少年 闲来无事,想起自己初学java的时候做的经典的无非就是打印出一些有意思 ...

  4. Java打印

    Java打印 import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Gra ...

  5. Java 打印程序设计实例

    3.1 打印文本 3.1.1 应用场景 假设我们需要打印一个窗体的某个文本编辑域(可能只有几行,也可能包含多页)的内容,并且每页最多打印 54 行,如何实现呢? 3.1.2 解决方法 基本思路如下:首 ...

  6. Java打印整数的二进制表示(代码与解析)

    Java打印整数的二进制表示(代码与解析) int a=-99; for(int i=0;i<32;i++){ int t=(a & 0x80000000>>>i)&g ...

  7. Java打印金字塔问题

    Java打印金字塔问题 public class 金字塔问题 { // //普通金字塔 // public static void main(String[] args) { // //先打印4层 / ...

  8. Java打印空心三角

    Java打印空心三角 public static void main(String[] args) { int n=5; //n表示输出空心三角形行数,这里以5行为例 for(int i=1;i< ...

  9. Java打印空心菱形

    使用Java打印空心菱形 public static void main(String[] args) { int n = 5; //这里输出菱形的上半部分 for (int i = 1; i < ...

随机推荐

  1. MAZE(2019年牛客多校第二场E题+线段树+矩阵乘法)

    题目链接 传送门 题意 在一张\(n\times m\)的矩阵里面,你每次可以往左右和下三个方向移动(不能回到上一次所在的格子),\(1\)表示这个位置是墙,\(0\)为空地. 现在有\(q\)次操作 ...

  2. python基础之八:知识小结及补充

    一.python2 与python3 的区别 1.在2中print后可带扣号,也可不带,3中必须带,否则报错! #print 'hello python2' print('hello python3' ...

  3. springCloud值Eureka

    Spring Cloud特点 约定优于配置 开箱即用.快速启动 适用于各种环境      PC Server  云环境  容器(Docker) 轻量级的组件  服务发现Eureka 组件的支持很丰富, ...

  4. Codeforces Round #605 (Div. 3) E - Nearest Opposite Parity (超级源点)

  5. Android Studio 星云常用配置工具箱

    1. 安装插件 1.1 Android View绑定框架 开源地址:https://github.com/JakeWharton/butterknife 插件地址: https://github.co ...

  6. 二分类问题F-score评判指标(转载)

    分类模型的评价指标Fscore 小书匠深度学习 分类方法常用的评估模型好坏的方法. 0.预设问题 假设我现在有一个二分类任务,是分析100封邮件是否是垃圾邮件,其中不是垃圾邮件有65封,是垃圾邮件有3 ...

  7. 第02组 Alpha冲刺(2/6)

    队名:無駄無駄 组长博客 作业博客 组员情况 张越洋 过去两天完成了哪些任务 任务分配.进度监督 提交记录(全组共用) 接下来的计划 沟通前后端成员,监督.提醒他们尽快完成各自的进度 还剩下哪些任务 ...

  8. laravel代码规范强制检查

    目录 介绍 代码规范检查与修复 在git commit时自动检查代码规范 后记 介绍 在团队协作开发中,代码规范是必要的.以前的规范都是自己定,然后手动检查,很难做到有效的约束. 现代的PHP,则有得 ...

  9. 【Linux脚本学习案例】shell脚本多通道并发执行存储过程

    使用shell脚本开启多个子任务并发调用存储过程,存储过程按照通道处理数据,提高效率: 外层调用脚本: #!/bin/sh #------------------------------------- ...

  10. github下载速度慢甚至多次失败,通过码云的导入功能导入github项目到码云上,然后再从码云下载

    github下载速度慢甚至多次失败,通过码云的导入功能导入github项目到码云上,然后再从码云下载 参考 https://blog.csdn.net/kcx64/article/details/83 ...