如何在 Java 中将 currentTimeMillis 转换为日期?
我在服务器中生成的某些日志文件中有毫秒,我也知道生成日志文件的区域设置,我的问题是将毫秒转换为指定格式的日期。 该日志的处理发生在位于不同时区的服务器上。当转换为“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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(13)
您可以使用
java.util.Date
类,然后使用SimpleDateFormat
来格式化Date
。我们可以使用 java.time 包(教程) - DateTime APIs 中介绍Java SE 8.
// 格式化日期
You may use
java.util.Date
class and then useSimpleDateFormat
to format theDate
.We can use java.time package (tutorial) - DateTime APIs introduced in the Java SE 8.
// Format the date
tl;dr
详细信息
其他答案使用过时或不正确的类。
避免使用旧的日期时间类,例如 java.util.Date/.Calendar。事实证明,它们设计不当、令人困惑且麻烦。
java.time
java.time框架内置于 Java 8 及更高版本中。大部分功能都向后移植到 Java 6 和 Java 6。 7 并进一步适应 Android。由制作 Joda-Time 的人制作。
即时
是 UTC 上的时间轴,分辨率为 纳秒。它的 纪元 是 UTC 1970 年的第一个时刻。假设您的输入数据是从 1970-01-01T00:00:00Z 开始的毫秒数(问题中不清楚),那么我们可以轻松实例化一个
Instant
。该标准 ISO 8601 格式的字符串是
Zulu
的缩写,表示 UTC。使用正确的时区名称应用时区,以获得
ZonedDateTime
。请参阅在 IdeOne.com 上实时运行的代码。
亚洲/加尔各答
时区?我猜您的印度时区会影响您的代码。我们在这里看到,调整到
Asia/Kolkata
时区会呈现与您报告的时间相同,08:55
,比我们的 UTC 值03:25
早五个半小时。默认区域
您可以应用 JVM 当前默认时区。请注意,默认值可能在运行时随时更改。 JVM 内任何应用程序的任何线程中的任何代码都可以更改当前默认值。如果重要,请询问用户所需/预期的时区。
关于 java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧遗留日期时间类,例如
java.util.Date
,日历
,&SimpleDateFormat
。Joda-Time 项目,现已在 维护模式,建议迁移到java.time 类。
要了解更多信息,请参阅 Oracle 教程 。并在 Stack Overflow 上搜索许多示例和解释。规范为 JSR 310。
使用符合 JDBC 驱动程序 jeps/170" rel="noreferrer">JDBC 4.2 或更高版本,您可以直接与数据库交换 java.time 对象。不需要字符串或 java.sql.* 类。
从哪里获取 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如
Interval
,YearWeek
、YearQuarter
和 更多。tl;dr
Details
The other answers use outmoded or incorrect classes.
Avoid the old date-time classes such as java.util.Date/.Calendar. They have proven to be poorly designed, confusing, and troublesome.
java.time
The java.time framework comes built into Java 8 and later. Much of the functionality is backported to Java 6 & 7 and further adapted to Android. Made by the some of the same folks as had made Joda-Time.
An
Instant
is a moment on the timeline in UTC with a resolution of nanoseconds. Its epoch is first moment of 1970 in UTC.Assuming your input data is a count of milliseconds from 1970-01-01T00:00:00Z (not clear in the Question), then we can easily instantiate an
Instant
.The
Z
in that standard ISO 8601 formatted string is short forZulu
and means UTC.Apply a time zone using a proper time zone name, to get a
ZonedDateTime
.See this code run live at IdeOne.com.
Asia/Kolkata
time zone ?I am guessing your are had an India time zone affecting your code. We see here that adjusting into
Asia/Kolkata
time zone renders the same time-of-day as you report,08:55
which is five and a half hours ahead of our UTC value03:25
.Default zone
You can apply the current default time zone of the JVM. Beware that the default can change at any moment during runtime. Any code in any thread of any app within the JVM can change the current default. If important, ask the user for their desired/expected time zone.
About java.time
The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as
java.util.Date
,Calendar
, &SimpleDateFormat
.The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.
To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.
With a JDBC driver complying with JDBC 4.2 or later, you may exchange java.time objects directly with your database. No need for strings or java.sql.* classes.
Where to obtain the java.time classes?
The ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as
Interval
,YearWeek
,YearQuarter
, and more.最简单的方法是使用 Joda DateTime 类 并指定所需的时间戳(以毫秒为单位)和 DateTimeZone。
我强烈建议避免使用内置的 Java Date 和 Calendar 类;他们太可怕了。
The easiest way to do this is to use the Joda DateTime class and specify both the timestamp in milliseconds and the DateTimeZone you want.
I strongly recommend avoiding the built-in Java Date and Calendar classes; they're terrible.
如果 millis 值是自 1970 年 1 月 1 日 GMT 以来的毫秒数(这是 JVM 的标准),那么它与时区无关。如果您想使用特定时区对其进行格式化,只需将其转换为 GregorianCalendar 对象并设置时区即可。之后有多种格式化方法。
If the millis value is number of millis since Jan 1, 1970 GMT, as is standard for the JVM, then that is independent of time zone. If you want to format it with a specific time zone, you can simply convert it to a GregorianCalendar object and set the timezone. After that there are numerous ways to format it.
我的解决方案
My Solution
最简单的方法:
Easiest way:
我这样做:
您还可以使用
getDateInstance(int style)
和以下参数:DateFormat.SHORT
DateFormat.MEDIUM
DateFormat .LONG
DateFormat.FULL
DateFormat.DEFAULT
I do it like this:
You can also use
getDateInstance(int style)
with following parameters:DateFormat.SHORT
DateFormat.MEDIUM
DateFormat.LONG
DateFormat.FULL
DateFormat.DEFAULT
SimpleDateFormat 类有一个名为 SetTimeZone(TimeZone) 的方法,该方法继承自 DateFormat 类。 http://docs.oracle.com/javase/6 /docs/api/java/text/DateFormat.html
The SimpleDateFormat class has a method called SetTimeZone(TimeZone) that is inherited from the DateFormat class. http://docs.oracle.com/javase/6/docs/api/java/text/DateFormat.html
你可以尝试java.time api;
You can try java.time api;
下面是我从毫秒获取日期到日期格式的解决方案。您必须使用 Joda Library 才能运行此代码。
Below is my solution to get date from miliseconds to date format. You have to use Joda Library to get this code run.
,
输出为
如果您不想要“删除 EEE 的天数”,则
如果您不想要日期,则删除 dd-MM-yyyy
如果您想要以小时、分钟、秒、毫秒为单位的时间,则使用 HH:mm:ss.SSS
并在您想要的
位置调用此方法
Output is
and
output is
if you do not want the Days Then Remove EEE,
if you do not want the Date Then Remove dd-MM-yyyy
If you want Time in Hour, Minutes, Second, Millisecond then Use HH:mm:ss.SSS
and Call this method where you want
where