Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.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,当我使用这些代码时,我会得到我们所在月份的日期。例如,我可以看到从2017年9月1日到2017年9月21日之间的日期 private void createRandomData(InMemoryCursor cursor) { List<Object[]> data = new ArrayList<>(); Calendar today = Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault());

当我使用这些代码时,我会得到我们所在月份的日期。例如,我可以看到从2017年9月1日到2017年9月21日之间的日期

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