Java 将 String 和 Long 转换为 DateTime

Java Convert String and Long to DateTime

我想从两个不同的变量生成一个 DateTime 变量(从 myLongDateAndTime 获取日期,从 myStringTime 获取时间,如何才能我这样做?

String myStringTime="12:30:10"; // Come from DB
long myLongDateAndTime= 1628197200000 // Come from another DB stores date and times in timestamp format of Thu Aug 05 2021 17:00:00 GMT-0400

DateTime myDateTime=??? // should get Thu Aug 05 2021 12:30:10

您正在组合两个日期,因此您需要做的是:

  • 从 long
  • 创建一个 joda DateTime
  • 将 DateTime 格式化为仅包含日期部分的字符串
  • 将日期字符串和时间字符串合并为一个字符串
  • 解析新字符串

这是您可以做到的方法:

public DateTime combineDates(long myLongDateAndTime, String myStringTime) {
    // 1 - create DateTime from the long
    DateTime dateFromLong = new DateTime(myLongDateAndTime);

    // 2 - Format dateFromLong as date string
    DateTimeFormatter dtfDate = DateTimeFormat.forPattern("dd/MM/yyyy");
    String dateString = dtfDate.print(dateFromLong);

    // 3 - Concatenate date part and time part in a new string
    String completeDate = dateString + " " + myStringTime;

    // 4 - Parse the new string in to a DateTime
    DateTimeFormatter dtfDateTime = 
    DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
    return dtfDateTime.parseDateTime(completeDate);
}

这只是一个可能的解决方案。还有很多其他方法可以做到这一点,例如不使用字符串连接,而只使用日期操作,但这种方法非常清晰易读,所以我不研究其他可能的解决方案。

一种可能的解决方案:

public class TestSample {

    public static void main(String[] args) {
        String myStringTime="12:30:10";
        Long myLongDateAndTime= 1628197200000L;

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss", Locale.ENGLISH);
        LocalTime time = LocalTime.parse(myStringTime, formatter);
        
        LocalDate date = Instant.ofEpochMilli(myLongDateAndTime).atZone(ZoneId.of("UTC")).toLocalDate();
        
        DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);
        LocalDateTime dtTime = LocalDateTime.parse(date.toString()+" "+time.toString(), formatter1);
        System.out.println(dtTime.toString());
    }
}

java.time

下面引用的是来自home page of Joda-Time的通知:

Note that from Java SE 8 onwards, users are asked to migrate to java.time (JSR-310) - a core part of the JDK which replaces this project.

解决方案使用 java.time,现代日期时间 API:

import java.time.Instant;
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;

public class Main {
    public static void main(String[] args) {
        String myStringTime = "12:30:10";
        long myLongDateAndTime = 1628197200000L;

        LocalTime time = LocalTime.parse(myStringTime);
        System.out.println(time);

        Instant instant = Instant.ofEpochMilli(myLongDateAndTime);
        System.out.println(instant);

        OffsetDateTime odt = instant.atOffset(ZoneOffset.of("-04:00"));
        System.out.println(odt);

        odt = odt.with(time);
        System.out.println(odt);
    }
}

输出:

12:30:10
2021-08-05T21:00:00Z
2021-08-05T17:00-04:00
2021-08-05T12:30:10-04:00

ONLINE DEMO

Trail: Date Time.

了解有关现代日期时间 API 的更多信息

为了完整起见

为了完整起见,下面给出了使用 Joda 日期时间的解决方案 API:

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.LocalTime;

public class Main {
    public static void main(String[] args) {
        String myStringTime = "12:30:10";
        long myLongDateAndTime = 1628197200000L;

        LocalTime time = LocalTime.parse(myStringTime);
        System.out.println(time);

        DateTime dateTime = new DateTime(Long.valueOf(myLongDateAndTime), DateTimeZone.forOffsetHours(-4));
        System.out.println(dateTime);

        dateTime = dateTime.withTime(time);
        System.out.println(dateTime);
    }
}

输出:

12:30:10.000
2021-08-05T17:00:00.000-04:00
2021-08-05T12:30:10.000-04:00

* 无论出于何种原因,如果您必须坚持Java 6 或Java 7,您可以使用ThreeTen-Backport which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and