【问题标题】:Improper date Conversion in Java from LocalDateTime to joda DateTimeJava中从LocalDateTime到joda DateTime的不正确日期转换
【发布时间】:2021-09-09 17:35:47
【问题描述】:

我正在输入 java.time.LocalDateTime 格式,因为我需要小时/分钟。

input : 2020-04-19T01:03:50

为了与 jpaRepostory 中的 oracle DB 交互,我正在使用

import org.joda.time.DateTime;
List<String> findApps(@Param("lastModifiedDate") DateTime lastModifiedDate);

对于从 LocalDate 到 dateTime 的转换,我正在使用这种方式

DateTime.parse(startDate.toString(), DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss"))

但是我得到了这个结果并且无法获取任何记录。

2020-04-19T01:03:50.000+05:30

谁能帮帮我。

PS:提前谢谢你。

【问题讨论】:

  • 我认为您必须以某种方式使用另一个掩码格式化 startDate,而不是使用 startDate.toString()。
  • 既然已经可以访问 java.time,为什么还要使用 Joda?只需从项目中删除 Joda,您就不需要再转换任何内容了。
  • 您的结果看起来正确。为了能够获取记录,您需要获得哪个结果?询问不知道是否或如何将 JPA 存储库与 Joda-Time 一起使用。

标签: java spring date jodatime localdate


【解决方案1】:

java.time

java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,改用modern Date-Time API*

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

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

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

import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;

public class Main {
    public static void main(String[] args) {
        LocalDateTime ldt = LocalDateTime.parse("2020-04-19T01:03:50");
        OffsetDateTime odtIndia = ldt.atZone(ZoneId.of("Asia/Kolkata")).toOffsetDateTime();
        System.out.println(odtIndia);
        OffsetDateTime odtUtc = odtIndia.withOffsetSameInstant(ZoneOffset.UTC);
        System.out.println(odtUtc);
    }
}

输出:

2020-04-19T01:03:50+05:30
2020-04-18T19:33:50Z

ONLINE DEMO

输出中的Z 是零时区偏移的timezone designator。它代表 Zulu,并指定 Etc/UTC 时区(时区偏移量为 +00:00 小时)。

Trail: Date Time 了解有关现代日期时间 API 的更多信息。

使用 Joda API:

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

public class Main {
    public static void main(String[] args) {
        LocalDateTime ldt = new LocalDateTime("2020-04-19T01:03:50");
        DateTime dtIndia = ldt.toDateTime(DateTimeZone.forID("Asia/Kolkata"));
        System.out.println(dtIndia);
        DateTime dtUtc = dtIndia.toDateTime(DateTimeZone.UTC);
        System.out.println(dtUtc);
    }
}

输出:

2020-04-19T01:03:50.000+05:30
2020-04-18T19:33:50.000Z

* 出于任何原因,如果您必须坚持使用 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】:

    你可以试试这样的

    import org.joda.time.DateTime;
    import org.joda.time.format.DateTimeFormat;
    import org.joda.time.format.DateTimeFormatter;
    
    public class Joda {
    
        public static void main(String[] args) {
            DateTime startDate = new DateTime();    
            DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss");
            String formatted = dtf.print(startDate); //prints 2021-06-26T17:32:50 
            System.out.println(formatted);      
            DateTime parsed = DateTime.parse(formatted, DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss"));
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-26
      • 2015-01-16
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 1970-01-01
      相关资源
      最近更新 更多