首先,让我引导您完成整个过程。
我想定制我制作的周历。它工作正常,但问题是当我在Samsung 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
当前日期是calendar.getTime()的20-4-2018,它是正确的,但是在添加以下行当前日期之后,我不知道为什么会发生。
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
您可以在日期前后看到我的输出。
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));。
date = date.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
定义一周的关键是WeekFields对象。假设您想要从周日开始的美国周:
WeekFields
WeekFields wf = WeekFields.SUNDAY_START;
进行此更改后,您将获得星期日:
2018-04-21 2018-04-15
或根据设备的区域设置使用几周:
WeekFields wf = WeekFields.of(Locale.getDefault(Locale.Category.DISPLAY));
对于迭代使用LocalDate.plusDays():
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.time现代Java日期和时间API。该Calendar班是早已过时的,并且java.time是与工作,以便更好。另一个优点是,LocalDate.toString()它可以为您提供使用的日期格式,因此您不再需要显式的格式化程序(它是ISO 8601格式)。而且,如果Calendar某些设备上的实现存在错误或类似问题,那么您显然可以摆脱这些麻烦。
java.time
Calendar
LocalDate.toString()
是的,java.time在较新和较旧的Android设备上均可正常运行。它至少需要Java 6 。
org.threeten.bp