Java 如何在Android上查找给定周的日期范围?

Java 如何在Android上查找给定周的日期范围?,java,date,calendar,Java,Date,Calendar,这简直快把我逼疯了 我到处都找遍了,例如,我发现了这个问题: 但是,我无法在我的实现中使用它(在NEXUS 7上的ANDROID API19上): 有人能看出我的错误吗?感谢您的帮助 **编辑** 似乎代码在Windows上运行良好,这是一个孤立的Android问题。写这个问题让我再次阅读了文档,我直觉地交换了顺序,因此函数现在看起来如下所示: public Pair<String,String> getWeekRange(int year, int week_no) {

这简直快把我逼疯了

我到处都找遍了,例如,我发现了这个问题:

但是,我无法在我的实现中使用它(在NEXUS 7上的ANDROID API19上):

有人能看出我的错误吗?感谢您的帮助

**编辑**


似乎代码在Windows上运行良好,这是一个孤立的Android问题。

写这个问题让我再次阅读了文档,我直觉地交换了顺序,因此函数现在看起来如下所示:

public Pair<String,String> getWeekRange(int year, int week_no) {

    Calendar cal = Calendar.getInstance();

    cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
    cal.set(Calendar.YEAR, year);
    cal.set(Calendar.WEEK_OF_YEAR, week_no);
    Date monday = cal.getTime();

    cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
    cal.set(Calendar.YEAR, year);
    cal.set(Calendar.WEEK_OF_YEAR, week_no);
    Date sunday = cal.getTime();

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
    return new Pair<String,String>(sdf.format(monday), sdf.format(sunday));
}
public Pair getWeekRange(整数年,整数周){
Calendar cal=Calendar.getInstance();
cal.set(Calendar.DAY\u OF_WEEK,Calendar.MONDAY);
校准设置(日历年、年份);
校准设置(日历。年份的周,周号);
Date monday=cal.getTime();
cal.set(Calendar.DAY\u OF_WEEK,Calendar.SUNDAY);
校准设置(日历年、年份);
校准设置(日历。年份的周,周号);
Date sunday=cal.getTime();
SimpleDataFormat sdf=新的SimpleDataFormat(“yyyy-MM-dd”,Locale.getDefault());
返回新的一对(sdf.format(星期一),sdf.format(星期日));
}
瞧,它现在给了我正确的日期。。。。一定是日历的内部实现问题,我不明白


仍然不知道冗余线路是否必要,但现在我很高兴它能工作

写这个问题让我再次阅读了文档,我直觉地交换了顺序,因此函数现在看起来如下所示:

public Pair<String,String> getWeekRange(int year, int week_no) {

    Calendar cal = Calendar.getInstance();

    cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
    cal.set(Calendar.YEAR, year);
    cal.set(Calendar.WEEK_OF_YEAR, week_no);
    Date monday = cal.getTime();

    cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
    cal.set(Calendar.YEAR, year);
    cal.set(Calendar.WEEK_OF_YEAR, week_no);
    Date sunday = cal.getTime();

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
    return new Pair<String,String>(sdf.format(monday), sdf.format(sunday));
}
public Pair getWeekRange(整数年,整数周){
Calendar cal=Calendar.getInstance();
cal.set(Calendar.DAY\u OF_WEEK,Calendar.MONDAY);
校准设置(日历年、年份);
校准设置(日历。年份的周,周号);
Date monday=cal.getTime();
cal.set(Calendar.DAY\u OF_WEEK,Calendar.SUNDAY);
校准设置(日历年、年份);
校准设置(日历。年份的周,周号);
Date sunday=cal.getTime();
SimpleDataFormat sdf=新的SimpleDataFormat(“yyyy-MM-dd”,Locale.getDefault());
返回新的一对(sdf.format(星期一),sdf.format(星期日));
}
瞧,它现在给了我正确的日期。。。。一定是日历的内部实现问题,我不明白


仍然不知道冗余线路是否必要,但现在我很高兴它能工作

我认为在这样的操作中使用它要好得多:

public Pair<String,String> getWeekRange(int year, int week_no) {
    DateTime startOfWeek = new DateTime().withYear(year).withWeekOfWeekyear(week_no);

    DateTime endOfWeek = startOfWeek.plusDays(6);

    return new Pair<String,String>(startOfWeek.toString(), endOfWeek.toString());
}
public Pair getWeekRange(整数年,整数周){
DateTime startOfWeek=新的DateTime()。withYear(年)。withWeekOfWeekyear(周号);
DateTime endOfWeek=startOfWeek.plusDays(6);
返回新对(startOfWeek.toString(),endOfWeek.toString());
}

我认为,对于这样的操作,最好使用:

public Pair<String,String> getWeekRange(int year, int week_no) {
    DateTime startOfWeek = new DateTime().withYear(year).withWeekOfWeekyear(week_no);

    DateTime endOfWeek = startOfWeek.plusDays(6);

    return new Pair<String,String>(startOfWeek.toString(), endOfWeek.toString());
}
public Pair getWeekRange(整数年,整数周){
DateTime startOfWeek=新的DateTime()。withYear(年)。withWeekOfWeekyear(周号);
DateTime endOfWeek=startOfWeek.plusDays(6);
返回新对(startOfWeek.toString(),endOfWeek.toString());
}

在不导入Pair类的情况下执行此操作

public  void getWeeksRangesDates(int y, int w) {
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.DAY_OF_MONTH, Calendar.MONDAY);
    cal.set(Calendar.YEAR, y);
    cal.set(Calendar.WEEK_OF_YEAR, w);
    Date date1 = cal.getTime();
    cal.add(Calendar.DATE, 6);
    Date date2 = cal.getTime();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
    Log.v("date1",sdf.format(date1));
    Log.v("date2", sdf.format(date2));  
}

在不导入Pair类的情况下执行此操作

public  void getWeeksRangesDates(int y, int w) {
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.DAY_OF_MONTH, Calendar.MONDAY);
    cal.set(Calendar.YEAR, y);
    cal.set(Calendar.WEEK_OF_YEAR, w);
    Date date1 = cal.getTime();
    cal.add(Calendar.DATE, 6);
    Date date2 = cal.getTime();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
    Log.v("date1",sdf.format(date1));
    Log.v("date2", sdf.format(date2));  
}

您的代码可以完美地工作,无需太多更改()。我所做的只是将函数
设置为静态
,并将其更改为打印输出,而不是返回
。当我测试代码时,您的代码看起来正常,并按预期工作。您确定您实际上是在测试发布的代码而不是其他东西吗?您使用的是哪个Java版本?是的,Java.util.Calendar和Date类令人困惑。避免两者。它们太糟糕了,以至于在Java8中被JSR310定义并受库启发的新Java.time.*类所取代。在您可以迁移到Java8之前,请使用Joda-Time。正如您在上面看到的,我添加了一个编辑,该错误仅发生在Android/Nexus7上。当然,我应该在一开始就提到这一点,但我有点迷失了方向。您的代码在没有太多更改的情况下完美地工作()。我所做的只是将函数
设置为静态
,并将其更改为打印输出,而不是返回
。当我测试代码时,您的代码看起来正常,并按预期工作。您确定您实际上是在测试发布的代码而不是其他东西吗?您使用的是哪个Java版本?是的,Java.util.Calendar和Date类令人困惑。避免两者。它们太糟糕了,以至于在Java8中被JSR310定义并受库启发的新Java.time.*类所取代。在您可以迁移到Java8之前,请使用Joda-Time。正如您在上面看到的,我添加了一个编辑,该错误仅发生在Android/Nexus7上。当然应该在一开始就提到这一点,但我有点迷路了。你可以使用cal.add(Calendar.Date,6)来获取星期天。这将为您节省3行:-)。您可以使用cal.add(Calendar.Date,6)获取星期天。这将为您节省3行:-)。您似乎是从“今天”开始计算,而不是从周一开始计算。如果有人想从星期一开始计算,那么在
withYear(year)
旁边,他还应该添加
。withDayOfWeek(1)
。无论如何,Joda的时间为+1。除了@Pshemo关于添加
的评论外,withDayOfWeek(1)
我必须记住,Joda时间不幸只适用于从周一开始的ISO周。对欧洲来说这是很好的,但在美国这是不可能的。Java8(和我的时间库)会做得更好。这个问题实际上是不使用Joda的一个很好的原因。Joda不支持本地化的周规则,这不仅在一周的第一天与周一不同时会出现问题,而且一年中的周编号也可能错误。您似乎是根据“今天”而不是周一进行计算。如果有人想从星期一开始计算,那么在
withYear(year)
旁边,他还应该添加
。withDayOfWeek(1)
。无论如何,Joda需要+1。除了@Pshemo关于添加
的评论之外。withDayOfWeek(1)
我必须记住