Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在某些设备上获取当前工作日的问题_Java_Android_Date_Calendar - Fatal编程技术网

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

Java 在某些设备上获取当前工作日的问题,java,android,date,calendar,Java,Android,Date,Calendar,首先,让我带你走过这个过程 我想定制我制作的周日历。它的工作很好,但问题是当我在三星SM-T531和MOTOG上运行相同的代码时,它会在上周返回给我 让我用代码解释一下 public WeekCalendar(Context context) { this.mContext = context; DateFormat format = new SimpleDateFormat("yyyy-MM-dd"); calendar.setTimeInMillis(System

首先,让我带你走过这个过程

我想定制我制作的周日历。它的工作很好,但问题是当我在三星SM-T531和MOTOG上运行相同的代码时,它会在上周返回给我

让我用代码解释一下

 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());

}
当前日期是日历上的2018年4月20日。getTime()这是正确的,但在添加以下行后,当前日期发生了更改,我不明白为什么会发生这种情况

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.previousorname(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()

我正在使用并推荐
java.time
,这是一种现代的java日期和时间API。
Calendar
类早已过时,
java.time
更适合使用。另一个优点是
LocalDate.toString()
提供了您使用的日期格式,因此您不再需要显式格式设置程序(ISO 8601格式)。如果在某些设备上的
日历
实现中存在bug或类似的问题,那么您显然没有这个问题

问题:我可以在Android上使用java.time吗? 是的,
java.time
在较旧和较新的Android设备上运行良好。它至少需要Java6

  • 在Java8和更高版本以及更新的Android设备上(我听说是API级别26),现代API是内置的
  • 在Java6和Java7中,获取三个后端口,即新类的后端口(三个用于JSR310;请参阅底部的链接)
  • 在(较旧的)Android上使用Android版本的ThreeTen Backport。它叫ThreeTenABP。并确保从带有子包的
    org.threeten.bp
    导入日期和时间类
链接
  • 解释如何使用
    java.time
  • ,其中首先描述了
    java.time
  • ,java.time的后端口
到Java6和Java7(JSR-310为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻

  • 作为一个考虑,考虑扔掉长期过时和臭名昭著的麻烦代码< SimpleDateFormat >代码>和朋友,并添加到Android项目中,以便使用<代码> java.时间>代码>,java java日期和时间API。和他一起工作真是太好了,我无法复制。在我的电脑上,我得到了
    格式化后的当前日期-2018-04-16
    ,然后
    当前日期-2018年4月16日星期一13:02:57 CEST
    。也就是说,同一周的星期一。这与我的观点一致。正如我所读到的,
    Calendar
    应该从
    YEAR+MONTH+WEEK\u OF theu MONTH+DAY\u OF theu WEEK
    字段解析日期。这可能是
    Calendar
    的Android实现中的一些特殊性(bug?)。设备之间的差异可能是因为不同版本的Android。这些设备有哪些版本?类似的:我使用的是三星OS 5.0.2和Moto G OS 6,这是我遇到的问题。
        WeekFields wf = WeekFields.of(Locale.getDefault(Locale.Category.DISPLAY));
    
        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