Add interval to a datetime

I want to achieve a similar operation in java:

time = "2014-05-19 13:36:05"
interval = "60 (seconds)"
time - interval = "2014-05-19 13:35:05"

What's the best approach to express this in Java given the following constraints:

Upvotes: 0

Views: 3777

Answers (6)

Basil Bourque
Basil Bourque

Reputation: 338516

java.time

The modern way is with java.time classes.

Do not conflate a point-in-time (a moment) with a span-of-time (a duration). Avoid representing a span-of-time using time-of-day notation as that creates ambiguity and confusion. Use standard ISO 8601 formatted strings to represent a duration: PnYnMnDTnHnMnS.

Do not conflate a date-time value (object) with a String representation. A date-time object can parse or generate a String but is distinct and separate from the String.

The java.time framework is rich with various date-time classes. Use these to represent your data as objects rather than mere numbers and strings.

The java.time classes use standard ISO 8601 formatted strings by default.

String input = "2014-05-19T13:36:05" ;
LocalDateTime ldt = LocalDateTime.parse( input );
Duration d = Duration.ofSeconds( 60 );
LocalDateTime later = ldt.plus( d );

ld.toString(): 2014-05-19T13:36:05

d.toString(): PT1M

later.toString(): 2014-05-19T13:37:05

See live code in IdeOne.com.

Note that LocalDateTime lacks any concept of time zone or offset-from-UTC. So this does not represent a moment on the timeline. Apply a zone or offset if you know one was intended. Already covered many times on Stack Overflow; search for OffsetDateTime and ZonedDateTime.

As for database and SQLite, there are many other Questions and Answers already handling this. Your JDBC 4.2 driver may handle conversion of java.time types directly. If not, store as string using standard ISO 8601 format.


About java.time

The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.

Where to obtain the java.time classes?

  • Java SE 8 and SE 9 and later
    • Built-in.
    • Part of the standard Java API with a bundled implementation.
    • Java 9 adds some minor features and fixes.
  • Java SE 6 and SE 7
    • Much of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport.
  • Android

The ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.

Upvotes: 2

Manuel Allenspach
Manuel Allenspach

Reputation: 12735

You could use something like this:

long minute = 1000*60;
Date date1 = new Date(); //current date
Date date2 = new Date(date1.getTime() - minute); //new date, 1 minute older
//or another method
long minute = 1000*60;
Date date1 = new Date();
date1.setTime(date1.getTime() - minute);

Date works with milliseconds since January 1, 1970, 00:00:00 GMT, so you can substract it like normal numbers.

Upvotes: 0

kraxor
kraxor

Reputation: 705

You should not work with String objects but Date instead. Only format date if and when you want to display it.

Date originalDate = new Date();
long diff = 60 * 1000; // milliseconds!

Date diffedDate = new Date(originalDate.getTime() - diff);

If you really want to do it the string way (which you should not), you can parse the date string like this:

String originalDateString = getDateTime(); // your current function
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date badlyDesignedOriginalDate = dateFormat.parse(originalDateString);
long diff = 60 * 1000; // milliseconds!
Date diffedDate = new Date(badlyDesignedOriginalDate.getTime() - diff);

But again, you should not do this.

Upvotes: 2

jordan
jordan

Reputation: 1017

You should work with "Date" objects, which basically represent an instance in time (number of milliseconds since Unix epoch) when doing the subtraction. Once you have a "Date" Object you can use "getTime" method (http://docs.oracle.com/javase/7/docs/api/java/util/Date.html#getTime()) to get this milliseconds value, and subtract 60 seconds (make sure to work with milliseconds not seconds!), and create a new "Date" with that resulting value.

This is one approach. There are many, Joda library is also quite popular. It has a method to subtract milliseconds from its date representation, http://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html#minusSeconds(int).

Upvotes: 4

JEY
JEY

Reputation: 7123

You should work only with Date object instread of String. Format your date into string only when you whant to display it.

With a Date object you will be able to get the value in ms and do computation on it. You can also use Calendar to breakdown a date.

Upvotes: 1

Danix
Danix

Reputation: 1947

Try using the joda-time library.

Here is the class to parse the date string.

Use:

dateTime.minusSeconds(int sec);

method to substract your interval.

Upvotes: 2

Related Questions