【发布时间】:2012-01-04 10:48:12
【问题描述】:
我在服务器中生成的某些日志文件中有毫秒,我也知道生成日志文件的语言环境,我的问题是将毫秒转换为指定格式的日期。 该日志的处理发生在位于不同时区的服务器上。虽然转换为“SimpleDateFormat”程序正在获取机器的日期,因为这样的格式化日期不代表服务器的正确时间。有什么方法可以优雅地处理这个吗?
long yourmilliseconds = 1322018752992l;
//1322018752992-Nov 22, 2011 9:25:52 PM
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS",Locale.US);
GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("US/Central"));
calendar.setTimeInMillis(yourmilliseconds);
System.out.println("GregorianCalendar -"+sdf.format(calendar.getTime()));
DateTime jodaTime = new DateTime(yourmilliseconds,
DateTimeZone.forTimeZone(TimeZone.getTimeZone("US/Central")));
DateTimeFormatter parser1 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss,SSS");
System.out.println("jodaTime "+parser1.print(jodaTime));
输出:
Gregorian Calendar -2011-11-23 08:55:52,992
jodaTime 2011-11-22 21:25:52,992
【问题讨论】:
-
不要将区域设置与时区混淆。完全分开。语言环境决定了月份和日期名称的人类语言,以及文化规范,例如月份、日期等部分的顺序。时区与 UTC 以及处理异常的规则(例如夏令时)不同。
-
问题是毫秒数不是从 1970-01-01T00:00:00Z 开始计算,而是从其他时刻开始计算吗?
-
仅供参考,糟糕的旧日期时间类(
GregorianCalendar、SimpleDateFormat等)和出色的 Joda-Time 库现在都被现代 java.time 类。