我可以使用以下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是所需的结果。
如何使用Java获得相同的结果?我将时区设置为CEST,因为这似乎是Ruby的工作方式。所以我尝试了这个:

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

最佳答案

您当前的代码存在三个问题:


“ CEST”不是Java识别的时区。尝试将Europe/Paris设置为欧洲时区
java.util.Calendar使用从0开始的月份(是的,太糟糕了)
您尚未清除Calendar的时间部分,因此它将为您提供当天的当前时间


这有效:

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());
    }
}


如果您提前知道月份,则可以改用常量:

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


但是,如果可以从Java 8转向使用Joda Timejava.time,则这些API更加简洁。

例如,在乔达时间:

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());
    }
}

07-24 12:52
查看更多