如何获得某个月的所有日期

时间:2017-09-21 14:09:52

标签: java android date calendar

当我使用这些代码时,我会得到我们所在月份的日期。例如,我可以看到从01/09/201721/09/2017之间的日期。

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

但是,我需要特定月份的日期。我怎样才能看到其他月份的其他日期?例如,我希望看到 4月的日期。它应该不是9月。(我知道它与today.clone()相关但我没有&# 39;了解我怎样才能改变它。)

我计划在Android工作室中将对话分开几个月,当我选择任何月份时,我应该会看到所有月份的日期。

我需要一个月的日期来做这件事,比如四月。我怎样才能得到四月的日期? (如果我得到四月的日期,我可以在所有月份都这样做)

编辑一些变化和结果:

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);
mStart.set(Calendar.DAY_OF_MONTH, 1);
data.add(createItem(mStart.getTimeInMillis()));
cursor.addAll(data);
}

我只是01/04/2017

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

我只是29/04/2017而如果我将mStart.set(Calendar.DAY_OF_MONTH, i)更改为mStart.set(Calendar.DAY_OF_MONTH, 1),则结果为01/04/2017

3 个答案:

答案 0 :(得分:0)

你从今天的日期开始,所以假设你想从那里开始几个月,只需使用:

cal.add(Calendar.MONTH, 1)移至下个月或

cal.add(Calendar.MONTH, -1)上个月搬到了。

答案 1 :(得分:0)

要获取特定月份的所有日期,请将Calendar设置为该月份的日期,例如第1个,询问Calendar该月份的日期数,然后获取日期。

您也可以在月份更改之前获取日期,但下面的代码会询问当月的天数,以说明如何执行此操作。

此代码只打印日期。你当然可以随心所欲地做任何事情。

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

测试

printDatesInMonth(2017, 2);

输出

01/02/2017
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

答案 2 :(得分:0)

@Andreas's answer提供了使用Calendar执行此操作的方法。我只想添加另一种方法。

旧类(DateCalendarSimpleDateFormat)有lots of problemsdesign issues,并且它们被新API取代

在Android中,您可以使用ThreeTen Backport,这是Java 8新日期/时间类的绝佳后端。为了使其有效,您还需要ThreeTenABP(更多关于如何使用它here)。

首先,您可以使用org.threeten.bp.YearMonth来表示月份和年份(在本例中为2017年4月)。然后你就会在这个月的所有日子里度过。

getTimeInMillis()方法采用自纪元(1970-01-01T00:00Z)以来的毫秒数,并且在您的代码中,您从JVM默认时区的午夜开始获取它。

在ThreeTen Backport中,您可以将YearMonth转换为org.threeten.bp.LocalDate,然后将其转换为JVM默认时区(使用org.threeten.bp.ZoneId),然后使用生成的{{ {1}}获取epoch millis值:

org.threeten.bp.ZonedDateTime

如果您还需要检查日期是否在当前日期之前,您可以添加其他支票:

// 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)) { .... TimeZone.getDefault()虽然看起来很方便,但也很棘手,因为JVM默认时区为can be changed without notice, even at runtime,所以总是做得更好它明确表示你正在使用哪一个。

API使用IANA timezones names(始终采用ZoneId.systemDefault()格式,如Region/CityAmerica/Sao_Paulo。 避免使用3个字母的缩写(例如Europe/BerlinCST),因为它们是ambiguous and not standard

您可以致电PST获取可用时区列表(并选择最适合您系统的时区)。

示例:要使用New York timezone,您可以执行以下操作:

ZoneId.getAvailableZoneIds()

.... // 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); .... America/New_York返回的有效名称之一。

的java.util.Calendar

关于您的代码,您需要从第0天开始,并将该项目添加到循环外的ZoneId.getAvailableZoneIds()(因此您只需添加最后一个 - 缩进代码,然后您#39 ; ll看到datadata.add循环之外。代码应该是这样的:

for