Java 在控制台中打印公历

Java 在控制台中打印公历,java,eclipse,calendar,Java,Eclipse,Calendar,我对Java相当陌生,我正在尝试构建一个程序,以下面的格式打印日历。它应该使用当前日期启动日历,并且仅提前1个月创建日历 Example: October 26, 2016. Su M T W T F S [October] | | | | | 27 | 28 | 29 | | 30 | 31 | | | |

我对Java相当陌生,我正在尝试构建一个程序,以下面的格式打印日历。它应该使用当前日期启动日历,并且仅提前1个月创建日历

Example: October 26, 2016. Su M T W T F S [October] | | | | | 27 | 28 | 29 | | 30 | 31 | | | | | | [November] | | | 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 |
您根本不应该使用
日历
格雷戈里安日历
类。它们麻烦、混乱、有缺陷且设计拙劣。现在,被班级取代了

LocalDate
该类表示一个仅限日期的值,不包含一天中的时间和时区

时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”

大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

要增加日期,只需一次增加一天

LocalDate nextDay = today.plusDays( 1 ); 
DayOfWeek
您可以作为枚举对象查询星期几

DayOfWeek dayOfWeek = today.getDayOfWeek();
月日 你可以询问月日(日期编号)

月名 您可以使用枚举获取自动本地化的月份名称。因此,无需使用示例代码中的开关
开关(每月)
。顺便说一句,请注意java.time将一月到十二月的月份编号为1-12,而不是旧式
Calendar
类中疯狂的0-11

String monthName = today.getMonth().getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH );
YearMonth ymStop = ymStart.plusMonths( 1 ); // Go from first month to the following month.
一个月几个星期 我无法在一个月内打印正确的周数

无需知道周数。当您一次递增一天时,请查看第二天何时切换到下个月。一种简单的方法是跟踪作为对象打印的月份

因为您想要比当前月份更多的月份,所以需要确定结束月份。就你而言,那将是下个月。您可以使用
YearMonth
类进行此类计算

String monthName = today.getMonth().getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH );
YearMonth ymStop = ymStart.plusMonths( 1 ); // Go from first month to the following month.
解决问题的方法不止一种。其他方法确实可以计算周数。我怀疑这样做会使你的问题复杂化

生成毛坯 如何在一周的正确日期开始日历

只要数一数

如果第一个日期是星期四,而你把星期日当作一周的第一天,那么你必须在输出中的前四个时隙(列)中创建“空白”(所有空格字符)。p> 如果您认为星期一是一周中的第一天,这在世界各地和ISO 8601标准中都很常见,那么您可以通过调用

DayOfWeek::getValue
获取从1到7的值,向
DayOfWeek
查询周中的订单。如果不是星期一,那么你需要另一种方法来计算从一周开始的天数。您可以使用
列表
来跟踪您预定的周内订单

List<DayOfWeek> daysOfWeekInOrder = new ArrayList<>( 7 );
daysOfWeekInOrder.add( DayOfWeek.SUNDAY );
daysOfWeekInOrder.add( DayOfWeek.MONDAY );
…
daysOfWeekInOrder.add( DayOfWeek.SATURDAY );
对于星期四,您将获得
5
,因此您知道需要循环
4次(4=5-1)来生成空格

同样,如果你的月最后一天是星期一,你可以询问星期一的天数,得到
2
,从
7
中减去,得到
5
,这样你就知道你需要生成五个空格来完成这个月


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • 后来
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如、、和

YearMonth ymStop = ymStart.plusMonths( 1 ); // Go from first month to the following month.
List<DayOfWeek> daysOfWeekInOrder = new ArrayList<>( 7 );
daysOfWeekInOrder.add( DayOfWeek.SUNDAY );
daysOfWeekInOrder.add( DayOfWeek.MONDAY );
…
daysOfWeekInOrder.add( DayOfWeek.SATURDAY );
int dayNumber = daysOfWeekInOrder.indexOf( today.getDayOfWeek() ) + 1 ;