【问题标题】:How to convert a sequence of characters into a date format to store in the database?如何将字符序列转换为日期格式存储在数据库中?
【发布时间】:2021-01-02 18:29:51
【问题描述】:

基于文件名,我必须将字符串分解为不同的元素数组,并且我能够从文件命名约定中提取时间戳,现在我需要将此字符串传递给日期格式以存储到数据库表:

示例: 20200913204839 字符串需要转换为日期格式为13-sep-2020 20:48:39 (column_name),pl/sql 块具有此格式列名-数据类型 (varchar2) 的参数值-插入语句中的值为:

to_date(column_name,'dd-mon-yyyy hh24:mi:ss')

这是等效的matlab代码:

 fn.fntestdate = datestr(datenum(column_name,'yymmddHHMM'),'dd-mmm-yyyy HH:MM:SS')

我如何在 Java 中加入相同的逻辑?

我尝试了几个函数 SimpleDateFormat 试图解析它,但收到“无法解析的函数”错误。

我认为 column_name 必须先转换为数字,然后再转换为日期才能解析? 加载前需要多次隐式转换。为此建议最好的方法

【问题讨论】:

  • 我建议你不要使用SimpleDateFormat。这个类是出了名的麻烦而且已经过时了。而是使用DateTimeFormatterjava.time, the modern Java date and time API 中的其他类。
  • 您的搜索结果是什么?类似的问题已经被反复询问和回答。正如我已经说过的,忽略显示使用SimpleDateFormat的答案。
  • 我进一步建议您不要在数据库中将日期存储为varchar2,而是使用其datetime 甚至更好的timestamp with time zone 数据类型。然后也不要将日期作为字符串发送到数据库,而是发送 LocalDateTimeOffsetDateTime(提到的类来自 java.time)。

标签: java string oracle date numbers


【解决方案1】:

这是一个适用于您的测试用例的示例:

import java.text.SimpleDateFormat;  
import java.util.Date;  
public class StringToDateExample1 {  
    public static void main(String[] args)throws Exception {  
        String sDate1="20200913204839";  
        Date date1=new SimpleDateFormat("yyyyMMddhhmmss").parse(sDate1);  
        System.out.println(date1);
    }  
}  

使用测试用例 20200913204839 它返回:

Sun Sep 13 20:48:39 UTC 2020

以下是 SimpleDateFormat 中字符的含义:

yyyy 表示一年(例如:2020)

MM 表示一个月(例如:7 月、8 月)

dd 表示一个月中的一天(例如:15)

HH 表示一天中的一个小时(例如:20)

mmss 分别表示分钟和秒(例如:52:34)

它不必是一个日期 - 一个字符串就可以了。

是的 - 使用 SimpleDateFormat 效果很好。

编辑:特定格式

我已针对您的情况专门对其进行了格式化:

import java.text.SimpleDateFormat;  
import java.util.Date;  
public class StringToDateExample1 {  
    public static void main(String[] args)throws Exception {  
        String sDate1="20200913204839";  
        Date date1=new SimpleDateFormat("yyyyMMddhhmmss").parse(sDate1);
        String formatted = new SimpleDateFormat("dd-EE-yyyy hh:mm:ss").format(date1);
        System.out.println(formatted);
    }  
} 

我们首先将字符串解析为日期,我们可以从中格式化。

一个测试用例20200913204839 返回:

13-Sun-2020 08:48:39

【讨论】:

  • 感谢您的解决方案,我得到了相同的结果,但在加载到 oracle 数据库之前,我需要以这种格式获取日期:'12-sep-2020 5:00:45''DD- MON-YYYY HH:MM:SS' 是 db 中的 string(varchar2) 列,请建议最后一步?
  • 我刚刚对其进行了一些调整,我得到了想要的输出,你太棒了,谢谢 Aniox,继续努力 :) 这是我编译的最终代码 { String sDate1="20200913204839" ;日期 date1=new SimpleDateFormat("yyyyMMddhhmmss").parse(sDate1);格式化字符串 = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss").format(date1); System.out.println(格式化); }
  • 嗯,是的,EE可以换成MMM。干杯!
  • 警告:SimpleDateFormat 使用系统的默认时区,除非它的时区被明确设置。这可能是也可能不是期望的行为。
  • 请不要教年轻人使用早已过时且臭名昭著的麻烦SimpleDateFormat类。至少不是第一选择。而且不是没有任何保留。今天我们在java.time, the modern Java date and time API, 和它的DateTimeFormatter 中做得更好。
【解决方案2】:

…为此建议最好的方法

这正是我正在做的。 :-)

java.time 和 JDBC 4.2

13-sep-2020 20:48:39 是一个不错的日期和时间。我想你的意思是指出一个时间点。它只在一个时区内有意义。因此,要存储时间点,请使用时区(例如 Asia/Ust-Nera)或与 UTC 的偏移量(例如 +10:00)存储时间。由于您使用的是 Oracle 数据库:如果我被正确告知,Oracle 的 timestamp with time zone 数据类型(与其他 RDBMS 不同)就是它所说的:带有时区的时间戳。因此,您应该能够将 Java ZonedDateTime 传输给它。这样做。

首先,解析字符串:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuuMMddHHmmss");
    ZoneId zone = ZoneId.systemDefault();
    
    String dateTimeFromFileName = "20200913204839";
    
    ZonedDateTime dateTime = LocalDateTime.parse(dateTimeFromFileName, formatter)
            .atZone(zone);
    System.out.println("Parsed date-time: " + dateTime);

到目前为止的输出在我的时区:

解析的日期时间:2020-09-13T20:48:39+02:00[Europe/Copenhagen]

我使用了我的 JVM 的默认时区。如果可以,请以 region/city 格式指定时区,例如:

    ZoneId zone = ZoneId.of("Asia/Ust-Nera");

其次,传递到一个期望 timestamp with time zone 的 PL/SQL 块(由于我手头没有 Oracle 数据库,因此未测试):

    CallableStatement stmt = yourDatabaseConnection
            .prepareCall("/* Your PL/SQL call goes here */");
    stmt.setObject(1, dateTime);
    stmt.execute();

总结建议

  • 不要在数据库中将日期存储或处理为varchar2,而是使用其datetime 或更好的timestamp with time zone 数据类型。
  • 不要将日期作为字符串发送到数据库。从 JDBC 4.2 开始,从java.time 发送一个适当的类型。您的 JDBC 驱动程序文档应该会告诉您要使用的正确 Java 类型。
  • 在 Java 中,始终使用现代 Java 日期和时间 API java.time 来处理日期和时间。

教程链接

Oracle tutorial: Date Time 解释如何使用 java.time。

【讨论】:

  • 非常有条理的解释!摘要部分的每一点都在前面的段落中得到了适当的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-07
  • 2019-09-05
  • 2013-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多