我想创建一个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
LocalDate.of( 2000 , Month.JANUARY , 2 )
.getDayOfMonth()
2
您现在可以只使用Java,不需要Apache DateUtils。截断是错误的思考方式;只是询问一天的财产。
使用LocalDate
类指定日期。请注意,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
询问每月的日期。你可以在qazxsw poi,qazxsw poi和qazxsw poi上打电话给qazxsw poi。
getDayOfMonth
2
如果接收LocalDate
对象,它可能是OffsetDateTime
。如果是这样,您可以轻松转换为java.time类。
ZonedDateTime
int dayOfMonth = ld.getDayOfMonth() ;
框架内置于Java 8及更高版本中。这些类取代了麻烦的旧Calendar
日期时间类,如GregorianCalendar
,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。
现在在legacy的java.util.Date
项目建议迁移到Calendar
班。
要了解更多信息,请参阅SimpleDateFormat
。并搜索Stack Overflow以获取许多示例和解释。规格是Joda-Time。
从哪里获取java.time类?
ThreeTen-Backport项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。你可能会在这里找到一些有用的类,如Android,ThreeTenABP,How to use ThreeTenABP…和ThreeTen-Extra。
似乎事情发生在时区。如果您避开该行,您的日历将以UTC和您当地区域的日期为准:
Interval
事情应该有效。
将日历传递给Date时,日期对象将获得您的案例中的默认时区CET。然后你截断并再次传递给UTC日历,由于CET和UTC之间的差异,你今天就是前一天。