【问题标题】:Java Convert String and Long to DateTimeJava 将 String 和 Long 转换为 DateTime
【发布时间】:2021-10-08 19:25:35
【问题描述】:

我想从两个不同的变量生成一个 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

【问题讨论】:

  • 这能回答你的问题吗? Java string to date conversion
  • @jhamon - 它不像链接中的要求那么简单:)。早些时候,我也不太确定应该将哪个问题标记为重复,但在阅读了 SO 创始人之一的文章Handling Duplicate Questions 之后,我更好地理解了它。简而言之,当要求完全相同时,应将问题标记为重复。
  • @jhamon 感谢您的回答,但我的问题是我读到 DateTime 是相互的,无法更改,在这里我想结合 2 种有点混淆的不同转换。
  • 亲爱的@ArvindKumarAvinash,感谢您的完整回答,感谢。那么既没有 setDate 也没有 setTime 来做类似 ``` new DateTime().setTime(myStringTime).setDate(myLongDateAndTime.toMillis()) ``` ?
  • 好的。谢谢你亲爱的@ArvindKumarAvinash

标签: java datetime jodatime


【解决方案1】:

java.time

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

请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。

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

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 Date-Time 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,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

【讨论】:

    【解决方案2】:

    您正在合并两个日期,所以您需要做的是:

    • 从 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);
    }
    

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

    【讨论】:

      【解决方案3】:

      一种可能的解决方案:

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

      【讨论】:

        猜你喜欢
        • 2019-07-31
        • 2021-10-24
        • 1970-01-01
        • 2018-05-29
        • 2011-12-03
        • 1970-01-01
        • 2011-12-22
        • 2014-11-24
        • 2017-08-20
        相关资源
        最近更新 更多