今天来吐槽一下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, M\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("M", 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来源:https://www.icode9.com/content-1-577251.html

java中输出日历_Java打印日历表相关推荐

  1. java中输出日历_Java输出日历写法

    package TestString_2; import java.text.ParseException; import java.util.Calendar; import java.util.G ...

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

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

  3. java 打印当月日历_Java打印日历表

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

  4. java字符串输出换行_java 打印例子(字符串换行问题)

    1.打印例子 java打印中最关键的就是每一个绘图函数 g2.drawString(str, x, y ) 中的起点坐标(x,y) import java.awt.BasicStroke; impor ...

  5. java中printnb方法_java打印技术---javax.print

    import java.io.*; import javax.print.*; import javax.print.attribute.*; import javax.print.attribute ...

  6. Java中char类型数组打印数组名输出结果不是地址值

    Java中其他类型数组打印数组名,输出结果都是内存地址 Java中char类型数组打印数组名,输出结果不是内存地址 char类型的数组就相当于一个字符串. 因为输出流System.out是PrintS ...

  7. java中输出一天每半个小时的时间段

    java中输出一天每半个小时的时间段.做法会有很多,我用的是最笨的方法,如有某位大神有简单方法可沟通交流. 最后有格式可以先看. public static void main(String[] ar ...

  8. java输入年月输出日历_java 输入年月,获取日历表

    /* 做日历作业: 输入一个时间如: 2016-11 就显示2016年11月的日历显示 */ import java.util.*; class calendar { public static vo ...

  9. java中输出打印 num_System.out.print。 如何将打印输出编号?(JAVA)

    因此,假设我打印出500名员工的巨大记录. 在打印出记录后,我希望它看起来像: 1. Matthew J. $USD 28.404 2. Donna M. $USD 43.254 3. Jordan ...

最新文章

  1. 详解使用DockerHub官方的mysql镜像生成容器
  2. 基于opencv实战眼睛控制鼠标
  3. 计算机课听课评议,听课优缺点评语
  4. 在Ubuntu下成功搭建以太坊私有链挖矿并转账
  5. linux终端命令教程,Linux终端命令入坑技巧
  6. java lambda 循环list_Java8--Lambda表达式对List集合操作(一)
  7. Keras-2 Keras Mnist
  8. 玩转 SpringBoot 2.x 之 RedisTemplate 操作
  9. Web前端笔记(5)
  10. android gridvie item,Android开发―解决自定义GridView高度第一个item高度异常问题
  11. paip.ollydbg 设置c++ qt API断点总结
  12. 在做模具设计过程中应注意哪些问题
  13. MySQL 读写分离原理
  14. JAVA_OPTS设置详解
  15. 深入学习Spring框架之一Spring的简要概括
  16. vinted是什么平台以及特点
  17. 读《矿矿上高中一年级》所得到的收获
  18. Could not find artifact com.oracle:ojdbc6:pom:11.2.0.3 in central
  19. 【笔试】店铺选址+最短路径
  20. flexslider插件使用体会

热门文章

  1. Android实战技巧之八:Ubuntu下切换JDK版本
  2. hadoop Permission denied (publickey,password,keyboard-interactive).
  3. opencv入门:支持向量机,K均值聚类
  4. 【mysql】phpstudy8打开MySQL命令行的方法
  5. HTML5七夕情人节表白网页_生日快乐粒子烟花(自定义文字)_ HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 抖音3D旋转相册 js烟花代码
  6. 金蝶应收应付模块流程_金蝶应收应付手册
  7. ijkplayer使用ffmpeg为视频添加水印avfilter_graph_parse_ptr返回Invalid data found when processing input
  8. PVT(Process Voltage Temperature)
  9. Adams调用cffsub求解动力学仿真过程中的摩擦力
  10. mysql8.0.20安装教程mac_mac安装mysql 8.0.20