开发者

Java equivalent of .NET DateTime.MinValue, DateTime.Today

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:

  • EPOCH1970-01-01T00:00:00Z
  • MIN-1000000000-01-01T00:00Z
  • MAX1000000000-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:

  1. 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)
  2. Joda DateTime is the preferred date/time library for Java.
  3. See additional notes on new Date(Long.MIN_VALUE) in Java
  4. Getting start of day with Java's Date is a little more involved - see here.
  5. .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.Dateorg.joda.time.DateTimejava.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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜