当我使用这些代码时,我会得到我们所在月份的日期。例如,我可以看到从01/09/2017
到21/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
答案 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
执行此操作的方法。我只想添加另一种方法。
旧类(Date
,Calendar
和SimpleDateFormat
)有lots of problems和design 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/City
或America/Sao_Paulo
。
避免使用3个字母的缩写(例如Europe/Berlin
或CST
),因为它们是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
返回的有效名称之一。
关于您的代码,您需要从第0天开始,并将该项目添加到循环外的ZoneId.getAvailableZoneIds()
(因此您只需添加最后一个 - 缩进代码,然后您#39 ; ll看到data
在data.add
循环之外。代码应该是这样的:
for