Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何以yyyy-MM-dd HH:MM:ss格式将毫秒更改为日期对象_Java_Datetime Format_Epoch_Milliseconds - Fatal编程技术网

Java 如何以yyyy-MM-dd HH:MM:ss格式将毫秒更改为日期对象

Java 如何以yyyy-MM-dd HH:MM:ss格式将毫秒更改为日期对象,java,datetime-format,epoch,milliseconds,Java,Datetime Format,Epoch,Milliseconds,如何将毫秒更改为yyyy-MM-dd HH:MM:ss格式的日期对象,如2017-04-12 23:14:52?您可以尝试此示例代码 public class MillDateConverter { public static String dFormat = "yyy-MM-dd HH:mm:ss"; private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dFormat);

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

您可以尝试此示例代码

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()));

    }

}

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

TL;DR:不要使用
日期
,使用
即时
。这两种格式中都不能包含格式。格式化为字符串取决于时区,因此需要选择时区

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

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

详细说明时区问题,由相同毫秒值表示的相同时间点可以格式化为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年在Java8中引入了
    java.Time
    类。那是三年前的事了,从写作到计数。因此,我想我们现在应该把
    Date
    和friends扔到海里,开始使用更新的类。因此,比起日期,你更喜欢即时的

    将毫秒更改为
    即时
    非常简单:

        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
    。如果要使用JVM的当前时区设置,只需填写
    ZoneId.systemDefault()
    。但是要注意,时区设置可能会被更改,即使是由运行在同一JVM中的无关程序更改,因此依赖它可能是脆弱的

    上述代码片段的结果是一个类似

    2017-04-12 23:14:52
    
    PS如果在阅读了上面的内容后,您确实坚持要这样做,那么下面是如何从上面获得
    java.util.Date

        Date myOutdatedDateInstance = Date.from(pointInTime);
    

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

    请提供输入毫秒数?您是否理解
    日期
    对象没有格式?请阅读我希望这个答案能帮助你你尝试过什么?你问之前搜索过吗?如果没有发现有用的东西,那就很有趣了。我也同意你的观点,@Tim,在这一点上似乎有两个问题:(1)如何将历元以来的毫秒转换为日期(或日期时间)对象(2)如何格式化所述对象。这两个问题以前都被问过很多次并回答过很多次。通过这样做,我将得到字符串SimpleDataFormat.format(calendar.getTime())返回字符串,但我需要java.utill.Date对象。在得到字符串后,我尝试过使用SimpleDataFormat.format(calendar.getTime()),但之后我得到的是2017年4月25日星期二23:52:17的IST格式,我不希望你问的是不可能的,或者更确切地说,是自相矛盾的@NilenduKumar。
    java.util.Date
    对象没有并且不能包含格式。这是一个时间点,仅此而已。