【问题标题】:how to convert date from "Tue May 08 2018 13:15:00 " to "2018-05-08 13:15:00.000" in java如何在java中将日期从“Tue May 08 2018 13:15:00”转换为“2018-05-08 13:15:00.000”
【发布时间】:2018-05-28 11:41:21
【问题描述】:

如何在 java 中将日期从 "Tue May 08 2018 13:15:00" 转换为 "2018-05-08 13:15:00.000",因为我必须将它用于自定义 sql 查询 ex-TO_timestamp('2018-05-08 13:15:00.000', 'YYYY-MM-DD HH24:MI:SS.FF') 中的 where 子句

【问题讨论】:

  • 到目前为止你尝试过什么?
  • 你为什么要使用字符串,它打开是为了安全问题?改为使用带有绑定变量的准备好的语句和 setTimestamp;那么你就不需要关心格式了。
  • @ewramner ,我正在从 UI 获取此类日期以从数据库中获取特定时间段的详细信息,并且我们正在编写查询(JPA 本机查询)如何在本机查询的 where 子句中使用此日期
  • 如果您从用户那里获得输入,则更有理由解析它并使用绑定变量,否则它们可能会潜入 drop 数据库。有关如何解析,请参阅另一个问题。 JPA 原生查询支持绑定变量。

标签: java sqldatetime date


【解决方案1】:

我想我有一个建议可以尝试解决您的问题...

注意:由于字符串中日期的转换,您可能必须配置 SimpleDateFormat 的区域设置。否则会抛出异常java.text.ParseException

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class Test {

    public static void main(String[] args) {

        try {
            String dateStr = "Tue May 08 2018 13:15:00";

            SimpleDateFormat sdfBefore = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss", Locale.ENGLISH);
            SimpleDateFormat sdfAfter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

            Date date = sdfBefore.parse(dateStr);

            System.out.println(sdfAfter.format(date));

        } catch (ParseException e) {
            e.printStackTrace();
        }

    }

}

我希望我有所帮助。

【讨论】:

  • 请不要教年轻人使用早已过时且臭名昭著的SimpleDateFormat类。至少不是第一选择。而且不是没有任何保留。今天我们在java.time, the modern Java date and time API 和它的DateTimeFormatter 中做得更好。
  • 好的!如果有人需要在遗留系统的 Java 6 中使用它,这可能是一个简单的解决方案。
【解决方案2】:

首先你需要解析你的字符串:

    DateTimeFormatter formatter 
            = DateTimeFormatter.ofPattern("EEE MMM dd uuuu H:mm:ss", Locale.ENGLISH);
    String dateTimeString = "Tue May 08 2018 13:15:00";
    LocalDateTime dateTime = LocalDateTime.parse(dateTimeString, formatter);
    System.out.println(dateTime);

打印出来

2018-05-08T13:15

正如 cmets 中所说,不要将字符串传输到数据库。假设您至少使用 Java 8 和 JDBC 4.2,只需通过您的 PreparedStatement 将解析的 LocalDateTime 对象提供给数据库,例如:

    PreparedStatement queryStatement = yourDbConnection.prepareStatement(
            "select * from your_table where your_column = ?");
    queryStatement.setObject(1, dateTime);

我假设您的字符串的来源和您的数据库就应该在哪个时区解释日期和时间达成一致。在大多数情况下,您应该更愿意明确说明时区。

对于任何阅读并需要像2018-05-08 13:15:00.000 这样的字符串以用于数据库查询以外的其他目的的人,获得这种格式的方法是通过另外一个格式化程序:

    DateTimeFormatter targetFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSS");
    String formattedDateTimeString = dateTime.format(targetFormatter);
    System.out.println(formattedDateTimeString);

打印出来

2018-05-08 13:15:00.000

链接: The Java™ Tutorials: Trail: Date Time 解释如何使用现代 Java 日期和时间 API java.time

【讨论】:

  • 感谢您提供详细解释的解决方案!
【解决方案3】:
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Test {

    public static void main(String[] args) {

        String dateStr = "Tue May 08 2018 13:15:00";
        DateTimeFormatter formatterFrom = DateTimeFormatter.ofPattern("EEE MMM dd yyyy HH:mm:ss");
        LocalDateTime localDate = LocalDateTime.parse(dateStr, formatterFrom);

        DateTimeFormatter formatterTo = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
        String localDate1 = formatterTo.format(localDate);

        System.out.println(localDate1); // 2018-05-08 13:15:00.000

    }

}

【讨论】:

    猜你喜欢
    • 2018-10-12
    • 1970-01-01
    • 2019-01-14
    • 2020-02-21
    • 2019-05-17
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 2019-12-02
    相关资源
    最近更新 更多