Java 如何获取某个月的所有日期
当我使用这些代码时,我会得到我们所在月份的日期。例如,我可以看到从2017年9月1日到2017年9月21日之间的日期Java 如何获取某个月的所有日期,java,android,date,calendar,Java,Android,Date,Calendar,当我使用这些代码时,我会得到我们所在月份的日期。例如,我可以看到从2017年9月1日到2017年9月21日之间的日期 private void createRandomData(InMemoryCursor cursor) { List<Object[]> data = new ArrayList<>(); Calendar today = Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault());
private void createRandomData(InMemoryCursor cursor) {
List<Object[]> data = new ArrayList<>();
Calendar today = Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault());
today.set(Calendar.HOUR_OF_DAY,0);
today.set(Calendar.MINUTE, 0);
today.set(Calendar.SECOND, 0);
today.set(Calendar.MILLISECOND, 0);
mStart = (Calendar) today.clone();
mStart.set(Calendar.DAY_OF_MONTH, 1);
while (mStart.compareTo(today) <= 0) {
data.add(createItem(mStart.getTimeInMillis()));
mStart.add(Calendar.DAY_OF_MONTH, 1);
}
cursor.addAll(data);
}
我刚刚得到2017年4月1日
private void createRandomData(InMemoryCursor cursor) {
List<Object[]> data = new ArrayList<>();
Calendar today = Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault());
today.set(Calendar.HOUR_OF_DAY,0);
today.set(Calendar.MINUTE, 0);
today.set(Calendar.SECOND, 0);
today.set(Calendar.MILLISECOND, 0);
mStart = (Calendar) today.clone();
mStart.set(Calendar.MONTH, Calendar.APRIL);
int daysInMonth = today.getActualMaximum(Calendar.DAY_OF_MONTH);
for(int i=0; i<daysInMonth; i++ ){
mStart.set(Calendar.DAY_OF_MONTH, i);}
data.add(createItem(mStart.getTimeInMillis()));
cursor.addAll(data);
}
private void createRandomData(InMemoryCursor游标){
列表数据=新的ArrayList();
Calendar today=Calendar.getInstance(TimeZone.getDefault(),Locale.getDefault());
今天。设置(日历。一天中的小时,0);
今天。设置(日历。分钟,0);
今天。设置(日历秒,0);
今天。设置(日历。毫秒,0);
mStart=(Calendar)today.clone();
mStart.set(Calendar.MONTH、Calendar.APRIL);
int daysInMonth=today.getActualMaximum(Calendar.DAY\u OF\u MONTH);
对于(int i=0;i您是从今天开始的,因此假设您希望从那里开始几个月,只需使用:
cal.add(Calendar.MONTH,1)
移动到下个月或
cal.add(Calendar.MONTH,-1)
移动到上个月。若要获取特定月份的所有日期,请将日历设置为该月份的某个日期,例如第1天,向日历询问该月份的日期数,然后获取日期
您也可以只获取月份更改之前的日期,但下面的代码会询问月份中的天数,以显示如何做到这一点
这段代码只是打印日期。你当然可以用它们做任何你想做的事情
public static void printDatesInMonth(int year, int month) {
SimpleDateFormat fmt = new SimpleDateFormat("dd/MM/yyyy");
Calendar cal = Calendar.getInstance();
cal.clear();
cal.set(year, month - 1, 1);
int daysInMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
for (int i = 0; i < daysInMonth; i++) {
System.out.println(fmt.format(cal.getTime()));
cal.add(Calendar.DAY_OF_MONTH, 1);
}
}
输出
2017年2月1日
02/02/2017
03/02/2017
04/02/2017
05/02/2017
06/02/2017
07/02/2017
08/02/2017
09/02/2017
10/02/2017
11/02/2017
12/02/2017
13/02/2017
14/02/2017
15/02/2017
16/02/2017
17/02/2017
18/02/2017
19/02/2017
20/02/2017
21/02/2017
22/02/2017
23/02/2017
24/02/2017
25/02/2017
26/02/2017
27/02/2017
28/02/2017
提供了使用日历执行此操作的方法。我只想添加另一种方法
旧类(Date
、Calendar
和SimpleDateFormat
)具有和,它们正在被新的API所取代
在Android中,您可以使用,这是Java8新的日期/时间类的一个很好的后端口
首先,您可以使用org.threeten.bp.YearMonth
来表示月份和年份(在本例中为2017年4月)。然后,您可以循环使用本月的所有日期
getTimeInMillis()
方法采用自epoch(1970-01-01T00:00Z
)以来的毫秒数,在代码中,从午夜的日期开始,在JVM默认时区中获取
在Three Ten Backport中,您可以通过将YearMonth
转换为org.ThreeTen.bp.LocalDate
,然后将其转换为JVM默认时区(使用org.ThreeTen.bp.ZoneId
),然后使用生成的org.ThreeTen.bp.ZoneDateTime
来获取历元毫秒值:
// April 2017
YearMonth ym = YearMonth.of(2017, 4);
// get the last day of month
int lastDay = ym.lengthOfMonth();
// loop through the days
for(int day = 1; day <= lastDay; day++) {
// create the day
LocalDate dt = ym.atDay(day);
// set to midnight at JVM default timezone
ZonedDateTime z = dt.atStartOfDay(ZoneId.systemDefault());
// get epoch millis value
data.add(createItem(z.toInstant().toEpochMilli()));
}
America/New_York
是由ZoneId.getAvailableZoneId()返回的有效名称之一
java.util.Calendar
关于您的代码,您从第0天开始,将项目添加到循环外部的数据中(因此您只需添加最后一个项目-缩进代码,您将看到数据。添加在for
循环外部)。代码应如下所示:
Calendar mStart = (Calendar) today.clone();
// set day to 1
mStart.set(Calendar.DAY_OF_MONTH, 1);
// set month to April
mStart.set(Calendar.MONTH, Calendar.APRIL);
// now mStart is April 1st, we can begin the loop
// get the number of days in April
int daysInMonth = today.getActualMaximum(Calendar.DAY_OF_MONTH);
// loop from day 1 to daysInMonth
for (int i = 1; i <= daysInMonth; i++) {
// set the day
mStart.set(Calendar.DAY_OF_MONTH, i);
// add item for the day
data.add(createItem(mStart.getTimeInMillis()));
}
// add all items to cursor
cursor.addAll(data);
Calendar mStart=(Calendar)today.clone();
//把一天定为一天
mStart.set(日历日/月,1);
//定月为四月
mStart.set(Calendar.MONTH、Calendar.APRIL);
//现在mStart是4月1日,我们可以开始循环了
//获取四月份的天数
int daysInMonth=today.getActualMaximum(Calendar.DAY\u OF\u MONTH);
//从第1天循环到每月的第1天
对于(inti=1;我已经尝试过mStart.set(Calendar.MONTH,3)
?是的,四月是3,因为在Calendar
API:@Hugo而不是3
,为什么不使用mStart.set(Calendar.MONTH,Calendar.April>)中的Calendar.April
?这就清楚了你的意思。@Andreas的确,我错过了(我使用了更多的新API,忘记了如何使用旧API)。谢谢!这两个都是相同的结果。我今天只得到了2017年4月21日。clone(),如何修复它?您应该同时设置日期和月份。在上面的代码中,您已经在这样做了:mStart.set(Calendar.day/u/u month,1);
-您删除了这个吗?
// April 2017
YearMonth ym = YearMonth.of(2017, 4);
// get the last day of month
int lastDay = ym.lengthOfMonth();
// loop through the days
for(int day = 1; day <= lastDay; day++) {
// create the day
LocalDate dt = ym.atDay(day);
// set to midnight at JVM default timezone
ZonedDateTime z = dt.atStartOfDay(ZoneId.systemDefault());
// get epoch millis value
data.add(createItem(z.toInstant().toEpochMilli()));
}
....
// today
LocalDate today = LocalDate.now();
// loop through the days
for (int day = 1; day <= lastDay; day++) {
// create the day
LocalDate dt = ym.atDay(day);
if (dt.isBefore(today)) {
....
....
// New York timezone
ZoneId ny = ZoneId.of("America/New_York");
// today in New York timezone
LocalDate today = LocalDate.now(ny);
// loop through the days
for (int day = 1; day <= lastDay; day++) {
// create the day
LocalDate dt = ym.atDay(day);
if (dt.isBefore(today)) {
// set to midnight at New York timezone
ZonedDateTime z = dt.atStartOfDay(ny);
....
Calendar mStart = (Calendar) today.clone();
// set day to 1
mStart.set(Calendar.DAY_OF_MONTH, 1);
// set month to April
mStart.set(Calendar.MONTH, Calendar.APRIL);
// now mStart is April 1st, we can begin the loop
// get the number of days in April
int daysInMonth = today.getActualMaximum(Calendar.DAY_OF_MONTH);
// loop from day 1 to daysInMonth
for (int i = 1; i <= daysInMonth; i++) {
// set the day
mStart.set(Calendar.DAY_OF_MONTH, i);
// add item for the day
data.add(createItem(mStart.getTimeInMillis()));
}
// add all items to cursor
cursor.addAll(data);