在某些设备上获取当前工作日的问题

时间:2018-04-20 10:01:51

标签: java android date calendar

首先,让我引导您完成整个过程。

我想定制我所制作的周历。它工作正常,但问题是当我在三星SM-T531和Moto G中运行相同的代码时它会在上周返回我。

让我用代码解释。

 public WeekCalendar(Context context) {
    this.mContext = context;

    DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.setFirstDayOfWeek(Calendar.MONDAY);

    Log.e(TAG, "Formatted Current Date Before - " + format.format(calendar.getTime()));
    Log.e(TAG, "Current Date Before - " + calendar.getTime());

    calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);

    Log.e(TAG, "Formatted Current Date After - " + format.format(calendar.getTime()));
    Log.e(TAG, "Current Date After - " + calendar.getTime());

    String[] days = new String[7];
    for (int i = 0; i < 7; i++) {

        days[i] = format.format(calendar.getTime());
        calendar.add(Calendar.DAY_OF_MONTH, 1);

        Log.e(TAG, "List days " + "" + days[i]);
    }

    weekDataModel.setDays(days);
    weekDataModel.setCurruntdate(Utility.getCurrentDate());

}

此代码的输出

    Formatted Current Date Before - 2018-04-20
    Current Date Before - Fri Apr 20 15:25:58 GMT+05:30 2018

    Formatted Current Date After - 2018-04-09
    Current Date After - Mon Apr 09 15:25:58 GMT+05:30 2018

    List days 2018-04-09
    List days 2018-04-10
    List days 2018-04-11
    List days 2018-04-12
    List days 2018-04-13
    List days 2018-04-14
    List days 2018-04-15

当前日期是20-4-2018来自calendar.getTime()它是正确的但是在添加下面的行当前日期改变后,我不明白为什么会发生这种情况。

calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);

您可以在日期之前和之后查看我的输出。

1 个答案:

答案 0 :(得分:3)

    LocalDate date = LocalDate.now(ZoneId.of("Asia/Colombo"));
    System.out.println(date);

    WeekFields wf = WeekFields.ISO;
    // set to first day of week (Monday for ISO, Sunday for USA)
    date = date.with(wf.dayOfWeek(), 1);

    System.out.println(date);

今天输出:

2018-04-21
2018-04-16

如果碰巧不是亚洲/科伦坡,请填写您想要的时区。

我假设你真的想迭代本周的日子,所以上面的片段将日期设置为一周的第一天。我已经指定了ISO周,即周一开始的周,所以你将在同一周的周一。如果你真的只想要最新的星期一,那么使用date = date.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));会更正确。

定义一周的关键是WeekFields对象。比如说你想要周日开始的美国周:

    WeekFields wf = WeekFields.SUNDAY_START;

通过此更改,您将获得星期日:

2018-04-21
2018-04-15

或者根据设备的区域设置使用周数:

    WeekFields wf = WeekFields.of(Locale.getDefault(Locale.Category.DISPLAY));

对于迭代,请使用LocalDate.plusDays()

    WeekFields wf = WeekFields.ISO;
    date = date.with(wf.dayOfWeek(), 1);

    System.out.println(date);

    LocalDate[] days = new LocalDate[7];
    for (int i = 0; i < 7; i++) {

        days[i] = date;
        date = date.plusDays(1);

        System.out.println("List days " + "" + days[i]);
    }

输出:

2018-04-16
List days 2018-04-16
List days 2018-04-17
List days 2018-04-18
List days 2018-04-19
List days 2018-04-20
List days 2018-04-21
List days 2018-04-22

我正在使用并推荐现代Java日期和时间API java.timeCalendar类已经过时了,java.time可以更好地使用。另一个优点是LocalDate.toString()为您提供了您使用的日期格式,因此您不再需要显式格式化程序(它是ISO 8601格式)。如果某些设备上的Calendar实施中存在错误或类似内容,那么您显然可以免除此错误。

问题:我可以在Android上使用java.time吗?

是的,java.time适用于较旧和较新的Android设备。它只需要至少Java 6

  • 在Java 8及更高版本和更新的Android设备上(来自API级别26,我被告知)现代API内置。
  • 在Java 6和7中获取ThreeTen Backport,新类的后端端口(适用于JSR 310的ThreeTen;请参阅底部的链接)。
  • On(较旧)Android使用Android版的ThreeTen Backport。它被称为ThreeTenABP。并确保使用子包从org.threeten.bp导入日期和时间类。

链接