本周末的Java日历

5

我想使用Java Calendar获取当前周末的日期,有什么快速的方法吗?


2
我猜你指的是西历?周末是星期四/星期五,或者在某些地方仅为星期日。 - Peter Lawrey
当前是指即将到来的时间,还是刚刚过去的时间? - Adeel Ansari
可能是重复的问题:Java示例获取给定月份中所有周末日期 - Basil Bourque
6个回答

12
Calendar c = Calendar.getInstance();
c.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
c.getTime(); // => Date of this coming Saturday.

我喜欢这里,因为我们不在乎今天是星期几。+1 - Adeel Ansari
现在已经过时了。java.time类取代了这里看到的麻烦老旧的Calendar类。 - Basil Bourque

1
Calendar currDate = Calendar.getInstance();;
currDate.add(Calendar.DAY_OF_YEAR, (Calendar.SATURDAY - currDate.get(Calendar.DAY_OF_WEEK) ));
System.out.println("weekend date is in the " + curreDate.get(Calendar.DAY_OF_MONTH));

我喜欢你的思路。使用所有的DAY_OF_XXXXX非常棒!加一分。 - Adeel Ansari
现在已经过时了。java.time类取代了这里看到的麻烦老旧的Calendar类。 - Basil Bourque

0

简而言之

LocalDate.now( ZoneId.of( "Pacific/Auckland" ) )                      // Today, in specific time zone.
         .with( TemporalAdjusters.nextOrSame( DayOfWeek.SATURDAY ) )  // Next Saturday, or today if already Saturday.
         .plusDays( 1 )                                               // Sunday

java.time

现代方法使用java.time类来替代麻烦的、设计不良的DateCalendar类。

当前日期

LocalDate类表示仅包含日期值而不包含时间和时区的值。

时区对于确定日期非常重要。对于任何给定的时刻,日期因时区而异。例如,在法国巴黎午夜后几分钟是新的一天,而在加拿大魁北克省蒙特利尔仍然是“昨天”。

请以continent/region的格式指定一个正确的时区名称,例如America/MontrealAfrica/CasablancaPacific/Auckland。绝对不要使用诸如ESTIST等3-4个字母缩写,因为它们不是真正的时区,没有标准化,甚至不唯一(!)。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

移动到下一个周末

您可以使用TemporalAdjuster接口的实现从一个日期调整到另一个日期。TemporalAdjusters类中提供了一些方便的实现,例如nextOrSame。使用DayOfWeek enum对象指定星期几。请注意,DayOfWeek是一个实际的对象,而不仅仅是一个数字或字符串,提供type-safety并确保有效值。

LocalDate saturday = today.with( TemporalAdjusters.nextOrSame( DayOfWeek.SATURDAY ) ) ;
LocalDate sunday = saturday.plusDays( 1 ) ;

如果你想要获取相同或之前的周末,调用previousOrSame调整器。


关于 java.time

java.time 框架是内置于 Java 8 及更高版本中的。这些类取代了麻烦的旧版遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。

想要了解更多,请参阅 Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是 JSR 310

您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。无需字符串,也不需要 java.sql.* 类。

如何获取 java.time 类?

ThreeTen-Extra 项目通过添加额外的类扩展了 java.time。该项目是 java.time 可能未来增加内容的试验场。您可能会在这里找到一些有用的类,例如 Interval, YearWeek, YearQuarter更多


0

试试这个:

String dayNames[]={"lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche"};
        String nomthNames[]={"janvier","février","mars","avril","mai","juin","juillet","Août","septembre","octobre","novembre","decembre"};
        Calendar date = Calendar.getInstance();
        String dayName = dayNames[date.get(Calendar.DAY_OF_WEEK)];
        String dayMonth = nomthNames[date.get(Calendar.MONTH)];

        lblBonjour.setText("<html><b>Bonjour, "+new Functions().getNomPrenom(myID)+"</b><br>"+
                "Ajourd'hui "+dayName+" "+date.get(Calendar.DATE)+" "+dayMonth+" "+date.get(Calendar.YEAR)+"<br>"+
                "Heure locale: "+date.get(Calendar.HOUR_OF_DAY)+":"+date.get(Calendar.MINUTE) );

0

Joda时间

new DateTime().withDayOfWeek(DateTimeConstants.SATURDAY)

Joda-Time 项目现已进入维护模式。该团队建议迁移到 Java 8 及更高版本中内置的 java.time 类。对于 Java 6 和 7,请参阅 ThreeTen-Backport 项目。 - Basil Bourque

0

试试这个。它会给出一周的开始和结束日期。

Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, cal.MONTH);
cal.set(Calendar.WEEK_OF_MONTH, cal.WEEK_OF_MONTH);
int weekStart = cal.getFirstDayOfWeek();
cal.set(Calendar.DAY_OF_WEEK,weekStart);
Date WeekStartDate=cal.getTime();
cal.set(Calendar.DAY_OF_WEEK,weekStart+7);
Date WeekEndDate=cal.getTime(

现在已经过时。java.time类取代了这里看到的麻烦旧日历类。 - Basil Bourque

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接