Java中从LocalDateTime到joda DateTime的不正确日期转换

Posted

技术标签:

【中文标题】Java中从LocalDateTime到joda DateTime的不正确日期转换【英文标题】:Improper date Conversion in Java from LocalDateTime to 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 一起使用。 【参考方案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 desugaring 和 How 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"));
    


【讨论】:

以上是关于Java中从LocalDateTime到joda DateTime的不正确日期转换的主要内容,如果未能解决你的问题,请参考以下文章

参数类型的隐式 ParameterBinderFactory[org.joda.time.LocalDateTime]

Scala,使用 play 2.5 将 joda.LocalDateTime 转换为 json

将 LocalDate 转换为 LocalDateTime 或 java.sql.Timestamp

java时间操作:获取当天剩余时间

这是joda time中的错误吗?处理非常古老(0000 年)的即时/负纪元

Joda DateTimeFormatter - 模式(字符串)的方法未定义