我正在尝试获取一个月中特定星期的开始和结束日期。但是日期不正确。谁能找出问题所在?
public class DateUtils
{
getWeeklyDateList(2020,5, 3);
public static void getWeeklyDateList(int year, int month, int week)
{
Calendar calendar = Calendar.getInstance(Locale.getDefault());
// setting year, month, week
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month);
calendar.set(Calendar.WEEK_OF_MONTH,week);
// setting day of week to first --> Sunday
calendar.set(Calendar.DAY_OF_WEEK, 1);
int year1 = calendar.get(Calendar.YEAR);
int month1 = calendar.get(Calendar.MONTH);
int day1 = calendar.get(Calendar.DAY_OF_MONTH);
// setting day of week to last --> Saturday
calendar.set(Calendar.DAY_OF_WEEK, 7);
int year7 = calendar.get(Calendar.YEAR);
int month7 = calendar.get(Calendar.MONTH);
int day7 = calendar.get(Calendar.DAY_OF_MONTH);
Log.e("date_start", String.valueOf(year1) + "-" + String.valueOf(month1) + "-" + String.valueOf(day1));
Log.e("date_end", String.valueOf(year7) + "-" + String.valueOf(month7) + "-" + String.valueOf(day7));
} }
答案 0 :(得分:3)
如果要使用现代Java日期和时间API java.time,可以通过以下简单方法完成:
private static WeekFields wf = WeekFields.of(Locale.forLanguageTag("ne-NP"));
public static void getWeeklyDateList(int year, Month month, int week) {
LocalDate someDateInTheWeek = LocalDate.of(year, month, 10).with(wf.weekOfMonth(), week);
LocalDate start = someDateInTheWeek.with(wf.dayOfWeek(), 1);
LocalDate end = someDateInTheWeek.with(wf.dayOfWeek(), 7);
System.out.println("date_start: " + start);
System.out.println("date_end: " + end);
}
使用示例参数进行尝试:
getWeeklyDateList(2020, Month.JUNE, 3);
输出为:
date_start: 2020-06-14 date_end: 2020-06-20
工作原理:
首先,在不同文化中,周的定义不同。在尼泊尔(因为您将尼泊尔加德满都作为您的所在地),星期从星期日开始,并以每月1号在每月1号的方式进行编号。为了处理本周的计划,我正在初始化一个用于尼泊尔文化的WeekFields
对象。
LocalDate
是不带日期的日期的java.time类。我认为选择哪个月份作为起点并不重要;我拿了第十名。从该日期起,我使用WeekFields
对象和提供的星期编号来获得正确的星期中的日期。依次根据尼泊尔对周的定义,从那里依次到达一周的第一天和最后一天:从2020年6月14日星期日到2020年6月20日星期六。
我无法分辨出您的代码出了什么问题。无论如何,您使用的Calendar
类的设计都不好,而且已经过时了。它还默认使用JVM的默认语言环境作为其周定义,这可能为您提供了与所需的不同的周方案。最后一点可能使您感到困惑:Calendar
不自然地将月份从1月的0到12月的11进行了编号。因此,当您指定5时,您将获得6月(而不是5月)。您已打印出结果日期的月份号,可能会在6月再次打印5(而非6)。
java.time在较新和较旧的Android设备上均可正常运行。它只需要至少 Java 6 。
org.threeten.bp
导入日期和时间类。java.time
。java.time
向Java 6和7(JSR-310的ThreeTen)的反向端口。答案 1 :(得分:0)
由于这一行, calendar.set(Calendar.DAY_OF_WEEK,1);
如果一周从上一个月开始,则这可能需要一个月到上个月。如果相差一个月,那就是问题所在。