我可以使用以下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 Time或
java.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());
}
}