javarubydatemillisecondsgregorian-calendar

How to calculate milliseconds with Java as in Ruby?


I can calculate the time in milliseconds with the following Ruby snippet:

$ irb
> require 'date'
 => true 
> Date.new(2014,9,5).to_time
 => 2014-09-05 00:00:00 +0200
> Date.new(2014,9,5).to_time.to_i * 1000
 => 1409868000000

1409868000000 is the desired result.
How can I get the same result with Java? I set the time zone to CEST since it seems to be what Ruby works with. So I tried this:

GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("CEST"));
calendar.set(2014, 9, 5);
System.out.println("" + calendar.getTimeInMillis());
// Returns: 1412498241422

Solution

  • There are three problems with your current code:

    This works:

    import java.util.*;
    
    public class Test {
        public static void main(String[] args) throws Exception {
            TimeZone zone = TimeZone.getTimeZone("Europe/Paris");
            Calendar calendar = new GregorianCalendar(zone);
            // Month 8 = September in 0-based month numbering
            calendar.set(2014, 8, 5, 0, 0, 0);
            calendar.set(Calendar.MILLISECOND, 0);
            System.out.println(calendar.getTimeInMillis());
        }
    }
    

    If you know the month in advance, you can use the constants instead:

    calendar.set(2014, Calendar.SEPTEMBER, 5, 0, 0, 0);
    

    If you can possibly move to using Joda Time or java.time from Java 8, however, those are much cleaner APIs.

    For example, in Joda Time:

    import org.joda.time.*;
    
    class Test {
        public static void main(String[] args) {
            DateTimeZone zone = DateTimeZone.forID("Europe/Paris");
            // Look ma, a sensible month numbering system!
            LocalDate date = new LocalDate(2014, 9, 5);
            DateTime zoned = date.toDateTimeAtStartOfDay(zone);
            System.out.println(zoned.getMillis());
        }
    }