如何用Ruby计算毫秒的毫秒数?

JJD*_*JJD 0 ruby java date gregorian-calendar milliseconds

我可以使用以下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
Run Code Online (Sandbox Code Playgroud)

1409868000000是期望的结果.
如何用Java获得相同的结果?我将时区设置为CEST,因为它似乎与Ruby一起工作.所以我尝试了这个:

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

Jon*_*eet 8

您当前的代码有三个问题:

  • "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());
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您事先知道这个月,则可以使用常量:

calendar.set(2014, Calendar.SEPTEMBER, 5, 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)

但是,如果您可以使用Joda Timejava.timeJava 8,那么这些API 就更清晰了.

例如,在Joda时间:

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());
    }
}
Run Code Online (Sandbox Code Playgroud)