提问人:Marco Frag Delle Monache 提问时间:11/17/2023 更新时间:11/18/2023 访问量:77
日期模式从 12 小时开始
Date Pattern starting from 12 hours
问:
我正在尝试将两个日期转换为此模式:.yyyy-MM-dd HH:mm:ss.SSS
我需要检索两个日期:
- 去年,同月,第 1 天,00:00:00.000
- 上个月的最后一天,23:59:59.999
因此,从今天开始,我需要这两个值:
2022-11-01 00:00:00.000
2023-10-31 23:59:59.999
问题是:我明白了.2022-11-01 12:00:00.000
这是生成去年日期的代码。
private String getLastYear() {
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Date date = new Date();
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.YEAR, -1);
c.set(Calendar.DAY_OF_MONTH, 1);
c.set(Calendar.HOUR, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
return format.format(c.getTime());
}
如果我尝试增加一个小时,输出将是:。2022-11-01 13:00:00.000
此外,我无法检索上个月的最后一天。正如我在这里读到的,我得到的只是下个月的第一天。
这是代码。
private String getPreviousMonth() {
DateFormat format = new SimpleDateFormat(DATE_PATTERN);
Calendar c = Calendar.getInstance();
Date date = new Date();
c.setTime(date);
c.add(Calendar.MONTH, -1);
c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
c.set(Calendar.HOUR, 23);
c.set(Calendar.MINUTE, 59);
c.set(Calendar.SECOND, 59);
c.set(Calendar.MILLISECOND, 999);
return format.format(c.getTime());
}
我错过了一些东西。 任何帮助都非常感谢!
答:
3赞
deHaar
11/17/2023
#1
您说非常感谢任何帮助,因此这里有一个使用 的示例,它以今天为基础,并计算两个期望的结果,如下所示:java.time
去年当月的第一天
- 从今天起减去一年( ⇒
2023-11-17
2022-11-17
) - 以当月的第一天(⇒
2022-11-17
2022-11-01
) - 涉及一天的开始 ( ⇒
2022-11-01
2022-11-01 00:00:00.000
)
上个月的最后一天在一天结束时
- 从今天起减去一个月 ( ⇒
2023-11-17
2023-10-17
) - 转到该月的最后一天 ( ⇒
2023-10-17
2023-10-31
) - 附加一天中的最长时间 ( ⇒
2023-10-31
2023-10-31 23:59:59.999
)
public static void main(String[] args) {
LocalDateTime lastYearSameMonthFirstDay
// today (without time of day)
= LocalDate.now()
// subtract 1 from the year
.minusYears(1)
// go to the first day of month
.with(TemporalAdjusters.firstDayOfMonth())
// append the start of the day
.atStartOfDay();
LocalDateTime lastDayOfPreviousMonth
// today (date only as above)
= LocalDate.now()
// subract 1 from the month value
.minusMonths(1)
// go to the last day of that month
.with(TemporalAdjusters.lastDayOfMonth())
// append the end of the day
.atTime(LocalTime.MAX);
// prepare a formatter for the output
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSS");
// and print both LocalDateTimes formatted as desired
System.out.println(lastYearSameMonthFirstDay.format(dtf));
System.out.println(lastDayOfPreviousMonth.format(dtf));
}
输出(执行日期 2023-11-17):
2022-11-01 00:00:00.000
2023-10-31 23:59:59.999
评论
1赞
Marco Frag Delle Monache
11/17/2023
尽快尝试!谢谢你的努力
2赞
deHaar
11/17/2023
这不是错别字,也有,但那里是时代之年......没有必要惹恼时代;-)但我认为,这种差异很少会影响你的情况。yyyy
java.time
1赞
Marco Frag Delle Monache
11/17/2023
工作顺利!再次感谢您的宝贵。时间!
2赞
MC Emperor
11/17/2023
是的。 是要走的路。TemporalAdjusters
1赞
Reilas
11/17/2023
@deHaar,你的箭头实体中有错别字!... .&rArr
1赞
Reilas
11/17/2023
#2
"...我需要检索两个日期:
- 去年,同月,第 1 天,00:00:00.000
- 上个月的最后一天,23:59:59.999......”
下面是一个示例。
import static java.util.Calendar.*;
Calendar a, b;
a = GregorianCalendar.getInstance();
a.set(YEAR, a.get(YEAR) - 1);
a.set(DAY_OF_MONTH, 1);
a.set(HOUR, 0);
a.set(MINUTE, 0);
a.set(SECOND, 0);
a.set(MILLISECOND, 0);
b = GregorianCalendar.getInstance();
b.add(MONTH, -1);
b.set(DAY_OF_MONTH, b.getActualMaximum(DAY_OF_MONTH));
b.set(HOUR_OF_DAY, 23);
b.set(MINUTE, 59);
b.set(SECOND, 59);
b.set(MILLISECOND, 999);
"...此外,我无法检索上个月的最后一天。正如我在这里读到的,我得到的只是下个月的第一天。..."
使用 getActualMaximum 方法。
"...我正在尝试将两个日期转换为此模式:
yyyy-MM-dd HH:mm:ss。SSS
的。..."
或者,您可以在此处使用基本格式说明符。
格式化程序 JavaDoc 中有一个完整的列表。
System.out.printf("%tF %<tT.%<tL%n", a.getTime());
System.out.printf("%tF %<tT.%<tL%n", b.getTime());
输出
2022-11-01 00:00:00.000
2023-10-31 23:59:59.999
评论
0赞
Marco Frag Delle Monache
11/19/2023
我很感谢你的帮助,但你的代码就像我的一样。我使用相同的功能来实现相同的目标。我没有收到我需要的输出(以及您指定的输出),这正是这个问题的目的:为什么它不能正常工作?无论如何,我使用 LocalDateTime 解决了。再次感谢您的帮助。
0赞
Reilas
11/19/2023
@MarcoFragDelleMonache,可能是其他版本的 Java?我不明白为什么,否则。
0赞
Marco Frag Delle Monache
11/20/2023
我使用的是 Java 8,但可能唯一的区别是您使用 而不是Calendar.HOUR_OF_DAY
Calendar.HOUR
1赞
Reilas
11/20/2023
@MarcoFragDelleMonache,您的要求之一是值为“2023-10-31 23:59:59.999”。这需要 HOUR_OF_DAY,而不是 HOUR。我相信,除非我忽略了什么。
0赞
Marco Frag Delle Monache
11/21/2023
事实上,你的正确方法
评论
LocalDateTime
应该使用代替 ,并且应该使它更容易。Date
LocalDateTime
Date
Calendar
Date
Calendar
SimpleDateFormat
LocalDateTime
DateTimeFormatter
Calendar
Date