我在服务器上生成的某些日志文件中有毫秒,我还知道日志文件生成的区域设置,我的问题是将毫秒转换为指定格式的日期。日志的处理发生在位于不同时区的服务器上。当转换为"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
发布于 2014-06-12 19:05:43
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timeStamp);
int mYear = calendar.get(Calendar.YEAR);
int mMonth = calendar.get(Calendar.MONTH);
int mDay = calendar.get(Calendar.DAY_OF_MONTH);
发布于 2011-11-23 12:15:23
您可以使用
类,然后使用
格式化
..。
Date date=new Date(millis);
我们可以使用
java.time
package (教程)-JavaSE8中引入的DateTime API。
var instance = java.time.Instant.ofEpochMilli(millis);
var localDateTime = java.time.LocalDateTime
.ofInstant(instance, java.time.ZoneId.of("Asia/Kolkata"));
var zonedDateTime = java.time.ZonedDateTime
.ofInstant(instance,java.time.ZoneId.of("Asia/Kolkata"));
var formatter = java.time.format.DateTimeFormatter.ofPattern("u-M-d hh:mm:ss a O");
var string = zonedDateTime.format(formatter);
发布于 2016-04-11 06:27:43
tl;dr
Instant.ofEpochMilli( 1_322_018_752_992L ) // Parse count of milliseconds-since-start-of-1970-UTC into an `Instant`.
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Assign a time zone to the `Instant` to produce a `ZonedDateTime` object.
详细信息
其他答案使用过时或不正确的类。
避免使用旧的日期-时间类,如java.util.Date/.Calendar。事实证明,它们设计得很差,令人困惑,而且很麻烦。
java.time
The The The
java.time
框架内置于Java 8及更高版本中。大部分功能是
向后移植到Java 6和7
并且进一步
适用于Android
..。是由一些同样的人制作的
Joda-Time
..。
一个
是时间线上的一个时刻
UTC
分辨率为
纳秒
..。Its
纪元
(
https://en.wikipedia.org/wiki/Epoch_(reference_date%29
)是以协调世界时为单位的1970年的第一个时刻。
假设您的输入数据是1970-01-01T00:00:00Z的毫秒计数(在问题中不清楚),那么我们可以很容易地实例化一个
..。
Instant instant = Instant.ofEpochMilli( 1_322_018_752_992L );
instant.toString():2011-11-23T03:25:52.992Z
The The The
在该标准中
ISO 8601
格式化字符串是
和方法
UTC
..。
使用应用时区
正确的时区名称
,来获取一个
..。
ZoneId zoneId = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = instant.atZone( zoneId );
看看这个
代码在IdeOne.com上实时运行
..。
时区?
我猜你的代码受到印度时区的影响。我们在这里看到,调整到
时区呈现的时间与您报告的时间相同,
比我们的UTC值提前了五个半小时
..。
2011-11-23T08:55:52.992+05:30
亚洲/加尔各答
默认区域
您可以将
当前默认时区
JVM的。请注意,默认值随时都可能更改
在运行时
..。JVM中任何应用程序的任何线程中的任何代码都可以更改当前的默认值。如果很重要,请询问用户所需/预期的时区。
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
关于
java.time
The The The
java.time
框架内置于Java 8及更高版本中。这些班级取代了麻烦的老班级。
遗留
日期-时间类,如
,&
..。
The The The
Joda-Time
项目,现在在
维护模式
,建议迁移到
java.time
类。
要了解更多信息,请参阅
Oracle教程
..。和搜索堆栈溢出,以获得许多示例和解释。规格为
JSR 310
..。
使用
JDBC驱动程序
遵守
JDBC 4.2
或者稍后,您可以交换
java.time
对象直接连接到您的数据库。不需要字符串或java.sql。
*
类。
从哪里获取java.time类?
Java SE 8
Java SE 9
,以及更高版本
内置的。
带有捆绑实现的标准Java API的一部分。
Java9添加了一些次要的特性和修复。
Java SE 6
和
Java SE 7
中的Java6和7中,很多java.time功能都被反向移植到Java6和7中
ThreeTen-Backport
..。
安卓
(
https://en.wikipedia.org/wiki/Android_(operating_system%29
)
更高版本的Android捆绑实现的java.time类。
对于早期的Android,
ThreeTenABP
项目适应
ThreeTen-Backport
(如上所述)。请参见
如何使用ThreeTenABP…
..。
The The The
ThreeTen-Extra
project通过附加的类扩展了java.time。这个项目是未来可能添加到java.time的试验场。您可能会在这里找到一些有用的类,例如
,以及
更多
..。
https://stackoverflow.com/questions/8237193
复制相似问题