gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 08:22:11 25 4
gpt4 key购买 nike

首先,让我向您介绍一下整个过程。

我想自定义我制作的周历。它工作正常,但问题是当我在三星 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

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

我假设您真的想遍历当前一周的几天,所以上面的代码 fragment 将日期设置为一周的第一天。我指定了 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.time,现代 Java 日期和时间 API。 Calendar 类早就过时了,而 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,新类的反向端口(ThreeTen for JSR 310;查看底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间类。

链接

关于java - 在某些设备上获取当前工作日的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49939067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com