如何将 yyyy/MM/dd hh:mm:ss 转换为秒?

Posted

技术标签:

【中文标题】如何将 yyyy/MM/dd hh:mm:ss 转换为秒?【英文标题】:How to convert yyy/MM/ss hh:mm:ss into seconds? 【发布时间】:2019-05-23 10:55:47 【问题描述】:

简介

我正在尝试从两个 Epoch 中获取秒数差异

2019-05-22 18:28:56 -> 1558542536 秒

2019-07-22 19:00:00 -> 1563814800 秒

差异将是:5,272,264 秒

此日期格式来自二进制文件作为字符串

我的代码

public static void main(String[] args) throws ParseException

    String regEpoch = "";
    long result = 0;

    //System.out.println((fecha = dateFormat.format(date)));


    try(RandomAccessFile raf = new RandomAccessFile("binario2.txt", "rw"))
      //user inputs a code (for now, doesn't matter if exists or not)
      System.out.print("Input a code to look for: ");
        String code = scan.next();
            while(!code.matches("\\d+"))
            
                System.out.println("[ERROR] Only digits accepted");
                System.out.print("Input a code to look for: ");
                    code = scan.next();
            


        //Gets the current date in seconds
        long getSecs = (new Date().getTime())/1000;
        System.out.println("Current tiem in secs: " + getSecs);

        //We are "randomly accessing" a binary file. The is no problem here at all. It just works.
        //Sets the pointer where I want it, again... this works fine.
        raf.seek(27+(80*Integer.parseInt(code)));

        //Read the String date correctly, which is 2019-05-22 18:28:56
        System.out.println(raf.readUTF());

        /*
        //Attempt 2
        System.out.println(java.time.Instant.ofEpochSecond(Long.parseLong(raf.readUTF())));

        Long millis = new SimpleDateFormat("yyyy/MM/ss hh:mm:ss").parse(raf.readUTF()).getTime();
        System.out.println(millis);
        */

        //Let's try to convert it into seconds... No we can't due to -> Unparseable date: "2019-05-22 18:28:56"
        Date dt = dateFormat.parse(raf.readUTF());
        long epoch = dt.getTime();
        System.out.println("Result is: " + (int)(epoch*1000));




    catch(IOException e)System.out.println("[ERROR] " + e); 

问题

我已经阅读了很多关于如何将秒变为 Epoch 的问题,但是反过来呢?

我必须手动完成吗? 有没有我没听说过的图书馆?

到目前为止,我尝试使用 SimpleDateFormat 仅从 Date 中获取秒数,但这不是我所期望的...

我对此有何期待

我目前正在做作业,我一直在计算停车罚单的价格,我想,如果车不离开,比如说……一周后怎么办?

如果我只以hh:mm:ss 的格式工作,那些在那里呆了一整周的汽车只会支付一天的费用。

【问题讨论】:

提示:你的格式是HH,而不是hh。我强烈建议您使用 java.time 而不是 SimpleDateFormat。 @JonSkeet 我读过一些关于它的文章。如果你能提供几个例子(我会忙于你的提示),我很乐意给你加分。 我建议创建一个minimal reproducible example 对字符串进行硬编码,然后尝试解析它。只需要几行代码,这将使您更容易为您提供帮助。您可以决定暂时使用SimpleDateFormat,或者立即转到 java.time。您还需要考虑这些日期/时间值所在的时区。 我建议你不要使用SimpleDateFormatDate。这些类设计不佳且早已过时,尤其是前者,尤其是出了名的麻烦。而是使用LocalDateTime 和/或ZonedDateTimeDateTimeFormatter,均来自java.time, the modern Java date and time API。 "我喜欢展望未来" 一个好的建议是不要针对复杂的解决方案,而是选择简单的解决方案,一旦实现,然后寻找更高级的解决方案和/或通用解决方案。 【参考方案1】:

ChronoUnit

我总是使用ChronoUnit 进行这样的计算。工作正常。

package test;

import java.text.ParseException;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;

public class Test2 

    public static void main(String[] args) throws ParseException 

        LocalDateTime date1 = LocalDateTime.parse("2019-05-22T18:58:56");
        LocalDateTime date2 = LocalDateTime.parse("2019-05-23T19:00:00"); //LocalDateTime.now();

        long seconds = ChronoUnit.SECONDS.between(date1, date2);

        System.out.println(seconds);
    


输出

86464

要使用 SimpleDateFormat 转换为日期,您可以查看例如Java time since the epoch

【讨论】:

假设驾车者不应该为春季时钟拨快时不存在的小时付费,在查询差异之前转换为ZonedDateTime 那个“T”是什么东西? 它只是 ISO 8601 标准中日期和时间之间的分隔符。见ISO 8601 最后一个问题。如果我使用 .now() 我也会得到毫秒。我如何解析它们?我试图弄清楚。与时间一起存储的字符串必须正好是 80 字节长。 @Rob 当我回来删除最后一个问题时,您发布了我正在阅读的网站。结束通话。【参考方案2】:

Duration

java.time 类计算一个Duration

在调整为标准 ISO 8601 格式后解析您的输入。

LocalDateTime ldtStart = LocalDateTime.parse( "2019-05-22 18:28:56".replace( " " , "T" ) ) ;

时区

指定时区,以解决夏令时 (DST) 等异常情况。日子并不总是 24 小时。

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdtStart = ldtStart.atZone( z ) ;

计算持续时间。

Duration d = Duration.between( zdtStart , zdtStop ) ;

long seconds = d.toSeconds() ;  // Or `getSeconds` before Java 9.

对于停车费,您更可能需要小时数。

long hours = d.toHours() ; 

【讨论】:

@WhiteGlove 仅供参考,DST 不是唯一的问题。世界各地的政客都表现出重新定义其管辖范围内的时区的倾向。半小时、一刻钟或其他奇怪的调整。采用夏令时,dropping DST,on DST “permanently”,back off DST “permanently”。乐趣永无止境。【参考方案3】:

这应该可以工作

new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2019-05-22 18:28:56").getTime();

【讨论】:

确实如此,但不正确。它有很大的不同。日期是"2019-05-22 18:28:56",它给出的milis是1556728136,即"Wednesday May 01, 2019 18:28:56 (pm)" 这些可怕的类在几年前被 JSR 310 中定义的 java.time 类所取代。建议在 2019 年使用它们是糟糕的建议。

以上是关于如何将 yyyy/MM/dd hh:mm:ss 转换为秒?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java中以字符串格式获取当前时间戳? “yyyy.MM.dd.HH.mm.ss”

使用 JavaScript 将 (YYYY/MM/DD HH:MM:SS.MS) GMT 转换为本地时间

SQLServer中将yyyy:MM:dd HH:mm:ss.sss转为yyyyMMddHHmmss

SQLServer中将yyyy:MM:dd HH:mm:ss.sss转为yyyyMMddHHmmss

有人能告诉我dateTimeString的正则表达式如下:“YYYY / MM / DD HH:MM:SS”[关闭]

js中字符串全部替换