Is there a Java equivalent of DateTime.MinValue and DateTime.Today in the Java Date class? Or a way of achieving something similar?
I've realised how spoilt you are with the .NET datetime cla开发者_如何学Goss, I also need the equivalent of AddDays(), AddMonths().
The de-facto Java datetime API is joda-time.
With it, you can get the current date/time by just constructing new DateTime()
.
Similarly, Without it, you can use Calendar.getInstance()
or new Date()
to obtain the current date/time.
MinValue
can be Calendar.getInstance(0)
/ new Date(0)
. This would use the default chronology - i.e. since January 1st, 1970. Since MinValue
returns Januar 1st, year 1, you can do that be simply specifying this date, using the appropriate constructor of DateTime
.
The other Answers may be correct but use outmoded classes.
java.time
The old date-time classes (java.util.Date/.Calendar etc.) were supplanted by Joda-Time, which in turn has been supplanted by the java.time framework built into Java 8 and later. The java.time classes are inspired by Joda-Time, defined by JSR 310, extended by the ThreeTen-Extra project, back-ported to Java 6 & 7 by the ThreeTen-Backport project, and adapted to Android in the ThreeTenABP project. See Tutorial.
To get the current moment on the timeline in UTC with a resolution of nanoseconds, use Instant
.
Instant now = Instant.now();
Instant
has three constants:
EPOCH
–1970-01-01T00:00:00Z
MIN
–-1000000000-01-01T00:00Z
MAX
–1000000000-12-31T23:59:59.999999999Z
To get the current moment for an offset-from-UTC, apply a ZoneOffset
to get an OffsetDateTime
.
OffsetDateTime now = OffsetDateTime.now( ZoneOffset.of( "-04:00" ) );
Better to apply a full time zone (offset plus rules for anomalies such as Daylight Saving Time) if known. Apply a ZoneId
to get a ZonedDateTime
.
ZonedDateTime now = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) );
You can perform arithmetic.
ZonedDateTime dayLater = now.plusDays( 1 );
ZonedDateTime monthLater = now.plusMonths( 1 );
You can get the first moment of a day.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime tomorrowStart = now.toLocalDate().atStartOfDay( zoneId ); // Usually time-of-day of `00:00:00.0` but not always.
If you need only a date without time-of-day and without time zone, use LocalDate
. Similarly, LocalTime
for time-only without date and without time zone. Usually better to stick with Instant
and OffsetDateTime
/ZonedDateTime
as the Local…
types do not represent actual moments on the timeline (no offset or time zone means they are undefined).
LocalDate localDate = LocalDate.now( zoneId );
LocalTime localTime = LocalTime.now( zoneId );
Comparison of Date/Time features in .NET and Java
.NET DateTime (C#) | Joda DateTime (Java, deprecated) [See Note #2] | Java Date |
---|---|---|
DateTime.MinValue | new DateTime(Long.MIN_VALUE) | new Date(Long.MIN_VALUE) [See Note #3] |
DateTime.Today | new DateTime().withTimeAtStartOfDay() | Messy [See Note #4] |
DateTime.Now | new DateTime() | new Date() |
DateTime.MaxValue | new DateTime(Long.MAX_VALUE) | new Date(Long.MAX_VALUE) |
Additional notes:
- Dealing with dates and times is messy. This table is intended to be a starting point for code migrations. The comparisons compare concepts, not exact values (e.g. .NET's minimum date/time is not the same value as Java's)
- Joda DateTime is the preferred date/time library for Java.
- See additional notes on
new Date(Long.MIN_VALUE)
in Java - Getting start of day with Java's Date is a little more involved - see here.
- .NET DateTimes default to local date/time, whereas in Java they default to UTC. Make sure to consider any impact of timezones when working with dates and times.
Joda-Time Deprecated
Joda-Time is deprecated. From their web-site archive:
Note that from Java SE 8 onwards, users are asked to migrate to java.time (JSR-310) - a core part of the JDK which replaces this project.
Meaning that java.util.Date → org.joda.time.DateTime → java.time.ZonedDateTime
Giving us new mappings:
.NET DateTime (C#) | java.time (formerly known as Joda-Time) | Java Date |
---|---|---|
DateTime.MinValue | LocalDateTime.MIN | new Date(Long.MIN_VALUE) |
DateTime.Today | LocalDateTime.of(LocalDate.NOW, LocalTime.MIDNIGHT) | (not available) |
DateTime.Now | LocalDateTime.now() | new Date() |
DateTime.UtcNow | LocalDateTime.now(ZoneOffset.UTC) | (not available) |
DateTime.MaxValue | LocalDateTime.MAX | new Date(Long.MAX_VALUE) |
The .NET DateTime
contains:
- date
- time
- and no particular information about what timezone it contains (except to day "Local", "UTC", or "Unspecified").
This means the java.time
equivalent is LocalDateTime
. If you want a datetime object that also carries with it an offset from UTC:
- .NET:
DateTimeOffset
java.time
:ZonedDateTime
Most date manipulation should be done using the Calendar object now.
http://download.oracle.com/javase/6/docs/api/java/util/Calendar.html
to get the current date:
Calendar calendar = Calendar.getInstance(); SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
try {
System.out.println("Today: " + dateFormat.format(calendar.getTime()));
} catch (Exception e) {
e.printStackTrace();
}
Theres calendar http://download.oracle.com/javase/1.5.0/docs/api/java/util/Calendar.html
And date http://download.oracle.com/javase/1.4.2/docs/api/java/util/Date.html
Theres also simpledateformat for formatting. http://download.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html
精彩评论