如何将此时间格式转换为 java 中的纪元? "Tue Dec 28 16:55:00 GMT+05:30 2021" 至纪元

How do I convert this time format into epoch in java? "Tue Dec 28 16:55:00 GMT+05:30 2021" to Epoch

我在我的 Android 项目中使用 'Single Date and Time Picker' 库,但它只有 returns 以下格式的日期和时间。

“12 月 28 日星期二 16:55:00 GMT+05:30 2021”

我想将其转换为纪元时间格式。

图书馆: https://github.com/florent37/SingleDateAndTimePicker

您的日期格式是EEE MMM dd HH:mm:ss zzzz yyyy

String date = "Tue Dec 28 16:55:00 GMT+05:30 2021";
try {
    val sdf = SimpleDateFormat("EEE MMM dd HH:mm:ss zzzz yyyy")
    val mDate = sdf.parse(date)
    val epochTime = TimeUnit.MILLISECONDS.toSeconds(mDate.time)
} catch (e: ParseException) {
    e.printStackTrace()
}
   

变量 epochTime 将存储秒数。
要将其转换回您可以执行的格式 -

val sdf = SimpleDateFormat("EEE MMM dd HH:mm:ss zzzz yyyy")
sdf.format(epochTime)

最新 Java 8 要求最低 Api 级别 26

    String date = "Tue Dec 28 16:55:00 GMT+05:30 2021";
    DateTimeFormatter format = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzzz yyyy");
    LocalDateTime parsedDate = LocalDateTime.parse(date, format);
    val milliSeconds = parsedDate.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();

按照 Ansari 的回答,我这样做是为了将其转换为 Epoch

SimpleDateFormat sdf3 = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzzz yyyy", Locale.ENGLISH);

Date d1 = null;
try{
d1 = sdf3.parse("Tue Dec 28 16:55:00 GMT+05:30 2021");
epochTime = TimeUnit.MILLISECONDS.toSeconds(d1.getTime());
Log.e("epoch time", "onDateSelected: "+epochTime );
}
catch (Exception e){ e.printStackTrace(); }

替代解决方案 java.time.OffsetDateTime

这是一个替代解决方案,它利用 java.time 保留输入的所有信息 String:

public static void main(String[] args) throws IOException {
    // input
    String dpDate = "Tue Dec 28 16:55:00 GMT+05:30 2021";
    // define a formatter with the pattern and locale of the input
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern(
            "EEE MMM dd HH:mm:ss OOOO uuuu", Locale.ENGLISH);
    // parse the input to an OffsetDateTime using the formatter
    OffsetDateTime odt = OffsetDateTime.parse(dpDate, dtf);
    // receive the moment in time represented by the OffsetDateTime
    Instant instant = odt.toInstant();
    // extract its epoch millis
    long epochMillis = instant.toEpochMilli();
    // and the epoch seconds
    long epochSeconds = instant.getEpochSecond();
    // and print all the values
    System.out.println(String.format("%s ---> %d (ms), %d (s)",
                                        odt, epochMillis, epochSeconds));
}

输出:

2021-12-28T16:55+05:30 ---> 1640690700000 (ms), 1640690700 (s)

A LocalDateTime 不应在此处使用,因为您可能会丢失有关偏移量的信息,并且由于输入缺少有关区域的信息 [=18] 而无法使用 ZonedDateTime =] 或 "America/Chicago",它只是提供与 UTC 的偏移量。

如果你只是想得到千分之一秒,你可以写一个简短的方法:

// define a constant formatter in the desired class
private static final DateTimeFormatter DTF_INPUT =
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(
            "EEE MMM dd HH:mm:ss OOOO uuuu", Locale.ENGLISH);

…

/**
 * parses the input, converts to an instant and returns the millis
 */
public static long getEpochMillisFrom(String input) {
    return OffsetDateTime.parse(input, DTF_INPUT)
                         .toInstant()
                         .toEpochMilli();
}