如何将毫秒更改为 yyyy-MM-dd HH:mm:ss 格式的日期对象 [重复]

Posted

技术标签:

【中文标题】如何将毫秒更改为 yyyy-MM-dd HH:mm:ss 格式的日期对象 [重复]【英文标题】:How to change miillisecond to Date Object in yyyy-MM-dd HH:mm:ss format [duplicate] 【发布时间】:2017-11-14 01:10:54 【问题描述】:

如何将毫秒更改为 yyyy-MM-dd HH:mm:ss 格式的 Date 对象,如 2017-04-12 23:14:52?

【问题讨论】:

请提供输入毫秒数? 你明白Date 对象没有格式吗?请阅读codeblog.jonskeet.uk/2017/04/23/all-about-java-util-date 希望这个回答对你有帮助***.com/questions/4142313/… 你试过什么?你问之前搜索过吗? 非常有趣,如果没有任何有用和有用的东西出现。它肯定已经在那里了,你可以比任何人在这里再次输入它更快地找到它。 我也同意你的观点,@Tim,这似乎有两个问题:(1)如何将自纪元以来的毫秒转换为日期(或日期时间)对象(2 ) 如何格式化所述对象。 两者之前都被问过很多次。 【参考方案1】:

你可以试试这个示例代码。

public class MillDateConverter 

    public static String dFormat = "yyy-MM-dd HH:mm:ss";
    private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dFormat);


    public static void main(String[] args) 
        Calendar calendar = Calendar.getInstance();
        long milliSec=Long.parseLong("1086073200000");
        System.out.println(milliSec);
        calendar.setTimeInMillis(milliSec);
        System.out.println(simpleDateFormat.format(calendar.getTime()));

    


【讨论】:

通过这样做我会得到 String simpleDateFormat.format(calendar.getTime()) 返回 String 但我想要 java.utill.Date 对象。我在得到字符串后尝试做 simpleDateFormat.format(calendar.getTime())) 但后来我得到了 Tue Apr 25 23:52:17 IST 2017 格式,这是我不想要的 你问的是不可能的,或者更确切地说,是自相矛盾的,@NilenduKumar。 java.util.Date 对象没有也不能有格式。这是一个时间点,仅此而已。【参考方案2】:

你不能那样做。有几个原因。

TL;DR:不要使用Date,使用Instant。这些都不能有格式。格式化成字符串取决于时区,所以需要选择时区。

首先,我从讨论中了解到,您要求使用格式为 yyyy-MM-dd HH:mm:ssjava.util.Date 对象。 Date 对象中没有也不能有格式。您应该在这里尝试理解的是数据本身与向用户呈现数据之间的区别。 int 可能保存值 25389,但它不保存格式 25389(实际上内部表示与 25389 完全不同)。相同的int 可以作为 25389、000025389、25,389 或 +25389 呈现给用户,这只是众多可能性中的一小部分。格式化发生在int 之外,而int 保持不变。

同样,Date 对象包含一个时间点。相同的日期可以格式化为例如 2017-04-12 23:14:52 或 April 12, 2017 11:14:52 PM。它甚至可以针对不同的时区进行格式化,如果系统有不同时区的用户,这将是一个好主意。或者,我们可以向用户显示日历叶和/或显示时间的时钟。同样,格式化发生在 Date 之外,而 Date 保持不变。

详细说明时区问题,由相同毫秒值表示的相同时间点可以格式化为 UTC 中的 2017-04-12 17:44:52,我的 2017-04-12 19:44:52时区,亚洲/加尔各答时区的 2017-04-12 23:14:52 甚至太平洋/奥克兰时区的 2017-04-13 05:44:52。请注意,在最后一种情况下,甚至日期都不相同。因此,将毫秒更改为您要求的格式的方法不止一种。我们需要知道您想要哪个时区才能为您提供帮助。

所以我相信你需要的不是一件事,而是两件事

    一种在程序中存储时间点的方法。 一种为某个时区的用户将时间点格式化为 yyyy-MM-dd HH:mm:ss 格式的字符串的方法。

要存储您的时间点,请使用任一

long 表示您已有的毫秒值 java.time.Instant 对象。

为什么我没有提到java.util.Date?因为这个类已经过时了。它的设计很快就变得很麻烦。他们试图通过弃用大多数方法并引入java.util.Calendar 来修复它,但这也效果不佳。最后,他们借鉴了一个名为 Joda-Time 的库的经验,于 2014 年在 Java 8 中引入了java.time 类。那是三年前的事了。所以恕我直言,我们现在应该把Date 和朋友扔到一边,开始使用更新的类。所以更喜欢Instant 而不是Date

将毫秒更改为 Instant 很简单:

    long milliseconds = 1492019092000L;
    Instant pointInTime = Instant.ofEpochMilli(milliseconds);

正如我所说,为了将您的即时格式化为用户的字符串,我们需要一个时区。然后做

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
    String formattedDateTimeString = pointInTime.atZone(ZoneId.of("Asia/Kolkata"))
            .format(formatter);

所以您需要填写我输入ZoneId.of("Asia/Kolkata") 的所需时区。如果要使用JVM当前的时区设置,只需填写ZoneId.systemDefault()即可。但请注意,时区设置可能会被更改,即使是在同一 JVM 中运行的不相关程序也是如此,因此依赖它可能会很脆弱。

上面代码sn-p的结果是一个类似的字符串

2017-04-12 23:14:52

PS 如果看完上面的内容你真的坚持,下面是如何从上面得到java.util.Date

    Date myOutdatedDateInstance = Date.from(pointInTime);

(请原谅我重复一遍,它仍然没有所需的格式,这是不可能的)。

【讨论】:

以上是关于如何将毫秒更改为 yyyy-MM-dd HH:mm:ss 格式的日期对象 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

时间戳(精确到毫秒)转yyyy-mm-dd hh:mm:ss

Objective-C dateformatter。 yyyy-MM-dd hh:mm:ss改为yyyy-MM-dd

来自 Hive 的 Pyspark 数据中带有毫秒 'YYYY-MM-DD hh:mm:ss.SSS' 的日期

如何将hAxis(x轴)格式更改为HH:mm?

SimpleDateFormat 中的yyyy-MM-dd HH:mm:ss.SSS说明

如何使用 moment.js 将此值 theHour[0].times 更改为时间格式 (HH:mm)