gpt4 book ai didi

java - Apache DateUtils 截断月份中的某一天

转载 作者:行者123 更新时间:2023-12-01 11:57:34 35 4
gpt4 key购买 nike

我想创建一个 DateHelper 类,为此我使用 Apache Commons Lang 2.6 中的 DateUtils。我在理解从日期提取字段时返回的结果时遇到问题。这是我的测试类,它在截断日期后提取月份中的某一天:

    public class DateTest {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// Date date = createDate(2000, 1, 2, 3, 4, 5, 6);

Calendar calendar = createEmptyUTCCalendar();
calendar.set(Calendar.YEAR, 2000);
calendar.set(Calendar.MONTH, 0); // january
calendar.set(Calendar.DAY_OF_MONTH, 2);
calendar.set(Calendar.HOUR_OF_DAY, 3);
calendar.set(Calendar.MINUTE, 4);
calendar.set(Calendar.SECOND, 5);
calendar.set(Calendar.MILLISECOND, 6);

Date date = calendar.getTime();
System.out.println("Input date\n" + date);

// Truncate from day of month.
Date dateTruncate = getDatePart(date);
System.out.println("Truncate the date\n" + dateTruncate);

System.out.println("\n*** Extract day of month ***");
// Extract the field day of month from the truncated date.
int fieldDayOfMonth = getField(dateTruncate, Calendar.DAY_OF_MONTH);
System.out.println("Expected result is 2\nActual result is " + fieldDayOfMonth);

assert fieldDayOfMonth == 2;
}

public static int getField(Date date, int calendarField) {
Calendar calendar = createEmptyUTCCalendar();
calendar.setTime(date);
int value = calendar.get(calendarField);
if (calendarField == Calendar.MONTH) {
value++;
}
return value;
}

public static Date getDatePart(Date date) {
return DateUtils.truncate(date, Calendar.DAY_OF_MONTH);
}

private static Calendar createEmptyUTCCalendar() {
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
return calendar;
}
}

我预计提取字段 Calendar.DAY_OF_MONTH 的结果是 2,但我得到了 1。

Input date
Sun Jan 02 04:04:05 CET 2000
Truncate the date
Sun Jan 02 00:00:00 CET 2000

*** Extract day of month ***
Expected result is 2
Actual result is 1

最佳答案

tl;博士

LocalDate.of( 2000 , Month.JANUARY , 2 )
.getDayOfMonth()

2

java.time

您现在可以只使用 Java,不需要 Apache DateUtils。截断是错误的思考方式。只需询问月份的属性即可。

使用 LocalDate 指定您的日期类(class)。请注意,java.time 使用相同的月份编号,1 月到 12 月为 1-12。

LocalDate ld = LocalDate.of( 2000 , 1 , 2 ) ;  // January 2, 2000.

或者使用Month枚举。

LocalDate ld = LocalDate.of( 2000 , Month.JANUARY , 2 ) ;  // January 2, 2000.

2000-01-02

查询月份中的某一天。您可以对 LocalDateOffsetDateTimeZonedDateTime 调用 getDayOfMonth

int dayOfMonth = ld.getDayOfMonth​() ;

2

如果接收 Calendar 对象,它可能是 GregorianCalendar。如果是这样,您可以轻松转换为 java.time 类。

if( myCalendar instanceOf GregorianCalendar ) {
GregorianCalendar gc = ( GregorianCalendar ) myCalendar ; // Cast.
ZonedDateTime zdt = gc.toZonedDateTime() ; // Convert from legacy class to modern class.
int dayOfMonth = zdt.getDayOfMonth​() ;
}
<小时/>

关于java.time

java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .

Joda-Time项目,现在位于 maintenance mode ,建议迁移到java.time类。

要了解更多信息,请参阅 Oracle Tutorial 。并在 Stack Overflow 上搜索许多示例和解释。规范为JSR 310 .

从哪里获取java.time类?

ThreeTen-Extra项目通过附加类扩展了 java.time。该项目是 java.time future 可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter ,和more .

关于java - Apache DateUtils 截断月份中的某一天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28316434/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com