日期模式从 12 小时开始

Date Pattern starting from 12 hours

提问人:Marco Frag Delle Monache 提问时间:11/17/2023 更新时间:11/18/2023 访问量:77

问:

我正在尝试将两个日期转换为此模式:.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());
}

我错过了一些东西。 任何帮助都非常感谢!

Java 日期 时间 simpledateformat

评论

3赞 Andrew S 11/17/2023
LocalDateTime应该使用代替 ,并且应该使它更容易。Date
0赞 Marco Frag Delle Monache 11/17/2023
我可能会考虑使用 ,但我仍然手动设置小时、分钟等。我只是不明白为什么它没有按预期工作。我不是新手。LocalDateTime
2赞 Abra 11/17/2023
添加了 java.time 包,因为类 和 有问题。为什么你更喜欢使用 and (and) 而不是 and ?DateCalendarDateCalendarSimpleDateFormatLocalDateTimeDateTimeFormatter
0赞 Marco Frag Delle Monache 11/17/2023
因为,在此之前,我不知道,也太不一致了。我学到了一些东西。CalendarDate
1赞 VGR 11/17/2023
您得到 12:00:00,因为您使用的是 Calendar.HOUR,它表示上午 / 下午 时间。您需要改用Calendar.HOUR_OF_DAY。

答:

3赞 deHaar 11/17/2023 #1

您说非常感谢任何帮助,因此这里有一个使用 的示例,它以今天为基础,并计算两个期望的结果,如下所示:java.time

去年当月的第一天
  • 从今天起减去一年( ⇒2023-11-172022-11-17)
  • 以当月的第一天(⇒2022-11-172022-11-01)
  • 涉及一天的开始 ( ⇒2022-11-012022-11-01 00:00:00.000)
上个月的最后一天在一天结束时
  • 从今天起减去一个月 ( ⇒2023-11-172023-10-17)
  • 转到该月的最后一天 ( ⇒2023-10-172023-10-31)
  • 附加一天中的最长时间 ( ⇒2023-10-312023-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
这不是错别字,也有,但那里是时代之年......没有必要惹恼时代;-)但我认为,这种差异很少会影响你的情况。yyyyjava.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_DAYCalendar.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
事实上,你的正确方法