今天来吐槽一下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 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

标签:WEEK,Java,get,打印,System,month,日历表,Calendar,DAY

来源: https://www.cnblogs.com/nonlinearthink/p/11922368.html

java 打印当月日历_Java打印日历表相关推荐

  1. java 输出当月日历_java 实现打印当前月份的日历

    实现当前日历的打印,当前日期用*来表示. 关键得出这个月的第一天是星期几. 基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在公式中d表示 ...

  2. java中输出日历_Java打印日历表

    今天来吐槽一下Java的Calendar类的使用问题,反正我是弄了半天. 首先是,遇到一个问题,输入年份和月份,需要打印这个月的日历,网上有不少代码,但我用了几个感觉都不是很靠谱. 然后经过一番探索, ...

  3. java 打印当月日历_74. Java打印当月日历

    自从Java 1.8 开始,提供了新的日期和时间处理对象,使用起来方便很多.对于新项目,推荐使用该API,为了兼容旧项目,原有的API仍然可以继续使用.下面就简单使用新的API打印当月的日历: pac ...

  4. java当月日历_java 实现打印当前月份的日历

    实现当前日历的打印.当前日期用*来表示. 关键得出这个月的第一天是星期几. 基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 在公式中d表示 ...

  5. java如何打印当前月份日历_java打印指定年月份的日历

    本文实例为大家分享了java打印指定年月份日历的具体代码,供大家参考,具体内容如下 做了一个小的日历打印,没有使用数组,所以不能对日期进行操作,用了单个for循环打印,对初学者来说应该好理解点 工具类 ...

  6. java打印菱形代码_Java打印菱形高效简洁代码

    importjava.util.Scanner;publicclass打印菱形{publicstaticvoidmain(String[]args){/**菱形******************** ...

  7. java中的日历_Java中的日历功能

    java.util.calendar类提供Java中的日历功能.是一个抽象类,提供在特定时间点和一组日历字段(例如YEAR,MONTH,DAY_OF_MONTH,HOUR等)之间进行转换的方法,以及用 ...

  8. java课程设计日历_java课程设计日历记事本赵锐.doc

    java课程设计日历记事本赵锐.doc 2本科生课程设计课程名称JAVA程序设计课程设计题目日历记事本学号201440930252学生姓名赵锐所在专业2014计算机学院所在班级信工2班成绩课程设计时间 ...

  9. java 打印某年的日历_java打印指定年月的日历

    本文实例为大家分享了Java打印指定年月日历的具体代码,供大家参考,具体内容如下 日历如下: 程序如下: //打印指定年月的日历 public class PrintCalendar { public ...

最新文章

  1. mysql 游标循环_mysql for循环遍历 游标用处
  2. [导入]ASP.NET 2.0 读取配置文件[INI](示例代码下载)
  3. java C++ 实现 leetcode 第三题 3. 无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
  4. 简单快速安装Apache+PHP+MySql服务环境(三)—— 下载安装phpmyadmin
  5. 天视通ipc地址修改工具_远程运行小工具PsExec
  6. sklearn学习笔记(3)svm多分类
  7. 上班工作压力太大?来玩个游戏解压下
  8. 服务器常见问题:服务器使用过程中感觉不流畅、卡顿
  9. Linux性能优化(七)——网络流量监控工具
  10. 压缩包加密后门_加密后门的问题
  11. html5页面缩小 不规整,移动端H5页面的设计尺寸大小规范
  12. 女巫小屋的指令Java_我的世界女巫小屋详介绍 我的世界女巫小屋种子代码一览...
  13. yolov5的anchor详解
  14. 当前不会命中断点还未为文档加载任何符号——问题探究
  15. matlab绘制累计频率曲线图,累积频率曲线怎么画,怎么画累计曲线图
  16. 跨境电商七大模式的优势与痛点
  17. CF400D Dima and Bacteria(并查集+Floyd)
  18. 谷歌开发者被封 账号中的钱_【IOS账号分享】Hitman goApp store上不可错过的游戏佳作,体验暗杀的艺术!...
  19. RabbitMQ--扩展--2.1--性能测试--window.md
  20. 产品推广,如何在家高效办公!

热门文章

  1. poj-1031-fence(不是我写的,我只是想看着方便)
  2. OpenWrt-DreamBox 20120201下设置二级路由
  3. javascript自动跳转
  4. 线程的调度有抢占式或者非抢占 (转)
  5. 网络主机监控-nagios应用漫谈(三)
  6. 职场中不可深交的五种人
  7. ubuntu 一个好系统
  8. 经济书籍:世界是平的
  9. Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 't
  10. golang string int int32 int64 float32 float64 time 互相转换