首先,让我引导您完成整个过程。
我想定制我所制作的周历。它工作正常,但问题是当我在三星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);
您可以在日期之前和之后查看我的输出。
答案 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.time
。 Calendar
类已经过时了,java.time
可以更好地使用。另一个优点是LocalDate.toString()
为您提供了您使用的日期格式,因此您不再需要显式格式化程序(它是ISO 8601格式)。如果某些设备上的Calendar
实施中存在错误或类似内容,那么您显然可以免除此错误。
是的,java.time
适用于较旧和较新的Android设备。它只需要至少Java 6 。
org.threeten.bp
导入日期和时间类。java.time
。java.time
。java.time
向Java 6和7的后端(JST-310的ThreeTen)。