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

```ruby
$ 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](http://www.timeanddate.com/library/abbreviations/timezones/eu/cest.html) since it seems to be what Ruby works with. So I tried this:

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

```

Answer: 
There are three problems with your current code:

* "CEST" isn't a time zone Java recognized. Try `Europe/Paris` instead, as a European time zone
* `java.util.Calendar` uses 0-based months (yes, it's awful)
* You haven't cleared out the time part of the `Calendar`, so it'll give you the current time of day, on that date

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](http://joda.org/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());
    }
}

```
*java.time*
===========

The `java.util` Date-Time API and their formatting API, `SimpleDateFormat` are outdated and error-prone. It is recommended to stop using them completely and switch to the [modern Date-Time API](https://www.oracle.com/technical-resources/articles/java/jf14-Date-Time.html)\*, released in March 2014.

Also, quoted below is a notice at the [Home Page of Joda-Time](https://www.joda.org/joda-time/):

> 
> 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.
> 
> 
> 

**Solution using `java.time`, the modern Date-Time API:**

```
import java.time.LocalDate;
import java.time.ZoneId;

public class Main {
    public static void main(String[] args) {    

        long millis = LocalDate.of(2014, 9, 5)
                                .atStartOfDay(ZoneId.of("Europe/Paris"))
                                .toInstant()
                                .toEpochMilli();

        System.out.println(millis);
    }
}

```

**Output:**

```
1409868000000

```

[`ONLINE DEMO`](https://ideone.com/c39t6w)

Avoid using two/three/four letter abbreviation for timezone name. Use the convention Region/City e.g. `Europe/Paris`. You can get the list of timezone names using [`ZoneId.getAvailableZoneIds()`](https://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html#getAvailableZoneIds--).

Learn more about the modern Date-Time API from **[Trail: Date Time](https://docs.oracle.com/javase/tutorial/datetime/index.html)**.

---

\* For any reason, if you have to stick to Java 6 or Java 7, you can use [***ThreeTen-Backport***](http://www.threeten.org/threetenbp/) which backports most of the *java.time* functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check [Java 8+ APIs available through desugaring](https://developer.android.com/studio/write/java8-support-table) and [How to use ThreeTenABP in Android Project](https://stackoverflow.com/questions/38922754/how-to-use-threetenabp-in-android-project).