30

我们有一个实用程序,可以在周一至周五之间的任何一天运行。它将更新内容管理工具中的一些文件。与该文件关联的最后修改日期应该是该周的星期一日期。我编写了以下程序来检索本周的星期一日期。但我仍然不确定这是否适用于所有场景。有没有人有更好的解决方案?

Calendar c = Calendar.getInstance();
c.setTime(new Date());
System.out.println(c.get(Calendar.DAY_OF_MONTH));
System.out.println(c.get(Calendar.DAY_OF_WEEK));
int mondayNo = c.get(Calendar.DAY_OF_MONTH)-c.get(Calendar.DAY_OF_WEEK)+2;
c.set(Calendar.DAY_OF_MONTH,mondayNo);
System.out.println("Date "+c.getTime());
4

9 回答 9

53

我强烈建议使用Joda Time代替(对于您所有的日期/时间工作,而不仅仅是这个):

// TODO: Consider time zones, calendars etc
LocalDate now = new LocalDate();
LocalDate monday = now.withDayOfWeek(DateTimeConstants.MONDAY);
System.out.println(monday);

请注意,由于您在这里使用了星期一,这是 Joda 时间一周的第一天,这将始终返回更早的一天(或同一天)。如果您选择星期三(例如),那么它将从星期一或星期二提前到星期三。如果您需要“下周三”或“上周三”,您可以随时添加或减去一周。

编辑:如果你真的想使用 java.util.Date/Calendar,你可以使用:

Calendar c = Calendar.getInstance();
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println("Date " + c.getTime());

可以Calendar.setFirstDayOfWeek用来表示一周是周一-周日还是周日-周六;我相信设置星期几将保持在本周内 - 但要测试它。

于 2012-02-16T08:40:18.063 回答
27
于 2016-07-06T19:27:28.210 回答
6

以下将起作用,包括包装月份:

Calendar c = Calendar.getInstance();
c.setFirstDayOfWeek(Calendar.MONDAY);
c.setTime(new Date());
int today = c.get(Calendar.DAY_OF_WEEK);
c.add(Calendar.DAY_OF_WEEK, -today+Calendar.MONDAY);
System.out.println("Date "+c.getTime());

但是,如果您在周日(例如 2 月 12 日周日)编辑您的申请,则日期将是下周一。根据您的要求(该应用程序仅在周一至周五运行),这应该不会造成问题。

于 2012-02-16T09:20:38.737 回答
2

正如乔恩建议的那样,calendar.set 方法有效......我已经在同月的星期一和另一个月的情况下使用以下代码段对其进行了测试:

Calendar c = Calendar.getInstance();
//ensure the method works within current month
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println("Date " + c.getTime());
//go to the 1st week of february, in which monday was in january
c.set(Calendar.DAY_OF_MONTH, 1);
System.out.println("Date " + c.getTime());
//test that setting day_of_week to monday gives a date in january
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println("Date " + c.getTime());
//same for tuesday
c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
System.out.println("Date " + c.getTime());

结果:

Date Mon Feb 13 10:29:41 CET 2012
Date Wed Feb 01 10:29:41 CET 2012
Date Mon Jan 30 10:29:41 CET 2012
Date Tue Jan 31 10:29:41 CET 2012
于 2012-02-16T09:34:40.773 回答
1

使用Joda Time库怎么样......看看这个答案......

于 2012-02-16T08:39:17.767 回答
0

对于 Android 6.0 或更高版本,请使用:

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
int day = 1, month = 7, year = 2018;
Calendar c = Calendar.getInstance();
c.setFirstDayOfWeek(Calendar.MONDAY);
c.set(year, month, day);
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);  //change de day to monday
String dateMonday= sdf.format(c.getTime());

对于 Android 5.1 或更低版本,它无法正常工作,我创建了自己的方法。

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
int day = 1, month = 7, year = 2018;
Calendar c = Calendar.getInstance();
c.setFirstDayOfWeek(Calendar.MONDAY);
//set the date with your date or the current date c.set(new Date());
c.set(year, month, day);

int diaSemana = c.get(Calendar.DAY_OF_WEEK);
for (int i = 0; i < 7; i++) {
 if (diaSemana != Calendar.MONDAY) {
     day--;
     c.set(year, month, day);
     diaSemana = c.get(Calendar.DAY_OF_WEEK);
     if (diaSemana == Calendar.MONDAY) break;
  } else {
    break;
 }
}
String dateMonday= sdf.format(c.getTime());
于 2019-02-08T18:39:52.433 回答
0

科特林代码。适用于较旧的 android 版本

    val c = Calendar.getInstance()
    c.time = Date()
    
    while (c.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
        c.add(Calendar.DAY_OF_WEEK, -1)
    }
于 2021-02-21T16:17:57.483 回答
0

如果您不想使用 Joda Time,您可以这样做来查找周数->(适用于 Android)

public static ArrayList<String> getWeeks(int month) {

ArrayList<String> arrayListValues = new ArrayList<>();
SimpleDateFormat sdf = new SimpleDateFormat("MMMM d");

Calendar calendar = Calendar.getInstance();

calendar.set(Calendar.MONTH, month);

int day = calendar.get(Calendar.DAY_OF_WEEK);
while (day != 1) {
  calendar.add(Calendar.DATE, 1);
  day = calendar.get(Calendar.DAY_OF_WEEK);
}

calendar.add(Calendar.DATE, -14);
String y1 = sdf.format(calendar.getTime());
calendar.add(Calendar.DATE, 6);
String y2 = sdf.format(calendar.getTime());
calendar.add(Calendar.DATE, 1);
arrayListValues.add(y1 + " - " + y2);

 y1 = sdf.format(calendar.getTime());
calendar.add(Calendar.DATE, 6);
 y2 = sdf.format(calendar.getTime());
calendar.add(Calendar.DATE, 1);
arrayListValues.add(y1 + " - " + y2);



for (int i = 0; i < 10; i++) {

  y1 = sdf.format(calendar.getTime());
  calendar.add(Calendar.DATE, 6);
  y2 = sdf.format(calendar.getTime());
  calendar.add(Calendar.DATE, 1);
  arrayListValues.add(y1 + " - " + y2);
}

return arrayListValues;
}
于 2016-07-06T12:38:15.453 回答
-2

如果当前周星期一是前一个月,它将不起作用......例如,如果今天是 6 月 1 日星期五......您可能应该使用滚动方法......

于 2012-02-16T08:54:12.613 回答