yyyy-mm-dd 在java和oracle中的区别。

本文详细分析了Java使用SimpleDateFormat进行日期格式化输出的方法,特别指出了日期格式化符号的大小写敏感性,并与Oracle的Date类型进行了对比,展示了两者在格式化时的差异。此外,还提供了Oracle Date类型进行日期格式化的方法,包括两种常见的转换方式。

之前没有注意过关于yyyy-mm-dd的写法,在最近的一次项目中才发现问题。一下做了详细的分析。

 通常java的工具Date类使用SimpleDateFormat进行日期转字符串的格式化输出。如:
// 定义日期格式
SimpleDateFormat dateformat =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:S");
//格式化一个系统日期
String starttime = dateformat.format(new Date(System.currentTimeMillis())).toString();

上面为标准格式
如果单纯要获得当天的年月日,可以写为
String today = new SimpleDateForma("yyyy-MM-dd").format(new Date());

值得注意的是,java定义的日期格式是区分大小写的!
MM表示月份,mm则表示分钟

下面是格式的详解
G Era 标志符 Text AD
y 年 Year 1996; 96
M 年中的月份 Month July; Jul; 07
w 年中的周数 Number 27
W 月份中的周数 Number 2
D 年中的天数 Number 189
d 月份中的天数 Number 10
F 月份中的星期 Number 2
E 星期中的天数 Text Tuesday; Tue
a Am/pm 标记 Text PM
H 一天中的小时数(0-23) Number 0
k 一天中的小时数(1-24) Number 24
K am/pm 中的小时数(0-11) Number 0
h am/pm 中的小时数(1-12) Number 12
m 小时中的分钟数 Number 30
s 分钟中的秒数 Number 55
S 毫秒数 Number 978
z 时区 General time zone Pacific Standard Time; PST; GMT-08:00
Z 时区 RFC 822 time zone -0800


再说说Oracle的Date类型
通常进行格式化有两种
Date转Varchar的 to_char(日期列名,'yyyy-mm-dd')
Varchar转Date的 to_date(日期字符串,'yyyy-mm-dd')

跟java的SimpleDateFormat相比
最明显的区别是它的格式化是不区分大小写的!所以格式表达会有所差异
由于MM和mm均是表示月份,分钟则用mi或MI来表示

下面是格式的详解
D                一周中的星期几
DAY           天的名字,使用空格填充到9个字符
DD             月中的第几天
DDD           年中的第几天
DY             天的简写名
IW             ISO标准的年中的第几周
IYYY         ISO标准的四位年份
YYYY        四位年份
YYY,YY,Y 年份的最后三位,两位,一位
HH            小时,按12小时计
HH24         小时,按24小时计
MI             分
SS            秒
MM            月
Mon         月份的简写
Month     月份的全名
W           该月的第几个星期
WW         年中的第几个星期

 

转自:http://hi.baidu.com/ganky/blog/item/d9b7681f9903d06ef724e46e.html

<think> 首先,用户的问题是关于期时间格式 'yyyy-MM-dd hh24:mi:ss' 的信息,询问其所属技术、使用方法等。用户提供了几个引用,我需要参考这些引用来回答。 回顾引用内容: - 引用[1]:指出JavaOracle期格式上的差异,Java中分钟是mmOracle中分钟是mi,月份是mm- 引用[2]:解释Java中使用SimpleDateFormat处理期格式,例如"yyyy-MM-dd HH:mm:ss"。 - 引用[3]:涉及JavaOracle、Dorado7中的期格式,包括示例代码转换CST时间。 - 引用[4]:讨论Oracle的to_char()函数,比较yyyy-mm-dd hh24:mi:ssyyyy-MM-dd HH:mm:ss的区别。 用户明确提到格式 'yyyy-MM-dd hh24:mi:ss',这似乎是混合了Oracle的格式。在Oracle中,hh24表示24小时制的小时,mi表示分钟。但在Java中,HH表示24小时制的小时,mm表示分钟。 用户说:"我想了解期时间格式 'yyyy-MM-dd hh24:mi:ss' 的相关信息",并提供了引用。引用[4]直接提到了类似的格式:"yyyy-mm-dd hh24:mi:ss"。 从引用[4],它讨论了Oracle的to_char()函数不同格式的区别。所以,这个格式 'yyyy-MM-dd hh24:mi:ss' 很可能是在Oracle数据库上下文中使用的。 在Oracle中: - yyyy- MM:月份(两位) - dd期(两位) - hh24:小时(24小时制) - mi:分钟 - ss:秒 在Java中,标准格式是 "yyyy-MM-dd HH:mm:ss",其中HH是24小时制的小时,mm是分钟。 用户的问题是关于 'yyyy-MM-dd hh24:mi:ss',这看起来像是一个Oracle格式,但使用了Java风格的破折号(-)。在Oracle中,分隔符可以是-或/,但hh24mi是Oracle特有的。 解释所属技术:这个格式主要用于Oracle数据库。在SQL查询中,当使用TO_CHAR函数将期转换为字符串时,会使用这种格式。 使用方法: -Oracle SQL中,使用TO_CHAR(date_column, 'yyyy-MM-dd hh24:mi:ss') 来格式化为这种字符串。 -Java中,如果要处理从Oracle查询的结果,需要使用正确的SimpleDateFormat来解析或格式化。Java的格式是 "yyyy-MM-dd HH:mm:ss",所以在Java中解析Oracle返回的字符串时,可能需要调整格式。 用户引用了[4]: "Oracle-时间格式化-to_char()函数;yyyy-mm-dd hh24:mi:ssyyyy-MM-dd HH:mm:ss的区别。" 所以,我应该在回答中引用这个。 回答结构: 1. 介绍格式:解释每个部分。 2. 所属技术:主要Oracle数据库。 3. 使用方法:在Oracle SQL中使用TO_CHAR函数;在Java中如何解析。 4. 注意事项:差异如分钟mi vs mm。 5. 生成相关问题:根据系统指令。 系统指令要求: - 所有行内数学表达式用$...$,但这里没有数学表达式,所以忽略。 - 独立公式用$$...$$,但也没有公式。 - LaTeX语法正确:不适用。 - 使用中文回答。 - 生成相关问题。 - 引用段落末尾添加引用标识,如 [^1]。 在回答中,引用相关部分时,添加引用标识。 例如,提到Oracle中的格式时,引用[^4]。 用户说:"上述引用仅供参考",所以我应该基于引用内容回答。 关键点: - 格式 'yyyy-MM-dd hh24:mi:ss' 是Oracle特定的期时间格式。 -Oracle中:hh24用于24小时制小时,mi用于分钟(因为mm是月份)。 -Java中:格式是 "yyyy-MM-dd HH:mm:ss",其中HH是小时,mm是分钟。 - 常见错误:使用Java格式在Oracle中会导致月份显示为分钟,如引用[1]提到。 - 使用方法:在Oracle查询中,使用TO_CHAR(sysdate, 'yyyy-MM-dd hh24:mi:ss')。 -Java中,从Oracle获取字符串后,使用SimpleDateFormat解析为期对象。 生成相关问题: - 类似于示例,如这个格式与其他格式的区别?如何在Oracle中使用?如何在Java中处理? 回答结构: - 开头解释格式所属技术。 - 详细描述每个部分。 - 使用方法示例。 - 注意事项。 - 最后生成相关问题。 确保中文回答。 </think> ### 期时间格式 'yyyy-MM-dd hh24:mi:ss' 的介绍及使用 您询问的期时间格式 `yyyy-MM-dd hh24:mi:ss` 主要属于 **Oracle 数据库技术**,常用于 SQL 查询中格式化期时间值。该格式结合了 Oracle 特有的占位符(如 `hh24` `mi`),用于表示时间在字符串形式的精确表达。下面我将逐步解释该格式的各个部分、所属技术、使用方法以及注意事项,确保内容参考您提供的引用信息。 #### 1. **格式组成部分详解** - **`yyyy`**:表示四位数的份,例如 2023。 - **`MM`**:表示两位数的月份,范围从 01 到 12。 - **`dd`**:表示两位数的期,范围从 01 到 31。 - **`hh24`**:表示 24 小时制的小时,范围从 00 到 23(`hh24` 是 Oracle 特有写法,区别Java 中的 `HH`)。 - **`mi`**:表示两位数的分钟,范围从 00 到 59(`mi` 是 Oracle 的分钟占位符,因为 `mm` 在 Oracle 中用于月份)。 - **`ss`**:表示两位数的秒,范围从 00 到 59。 - **分隔符 `-` `:`**:`-` 用于分隔、月、,`:` 用于分隔小时、分钟、秒。这种分隔符风格类似 Java,但在 Oracle 中同样适用。 此格式主要用于将期时间值转换为人类可读的字符串,例如输出 `2023-10-05 14:30:45`。注意,`hh24` `mi` 是 Oracle 特有的关键点,以避免与月份混淆(在 Java 中,分钟用 `mm` 表示,而月份用 `MM`)[^1][^4]。 #### 2. **所属技术** - 该格式 **主要应用于 Oracle 数据库**,在 SQL 查询中使用内置函数如 `TO_CHAR()` 来格式化期时间列或表达式。 - 为什么是 Oracle 特有?Oracle 使用 `mi` 区分分钟(minute),而其他技术如 Java 使用 `mm` 表示分钟。例如: -Oracle 中:`mi` = 分钟,`mm` = 月份。 -Java 中:`mm` = 分钟,`MM` = 月份。 这种差异容易导致错误,如将 Java 格式直接用于 Oracle 查询时,分钟会显示为月份值[^1][^4]。 - 此格式不直接用于 Java,但 Java 程序常需要处理从 Oracle 数据库返回的这种格式的字符串。 #### 3. **使用方法** 在 Oracle 数据库中使用该格式时,需结合 `TO_CHAR()` 函数;在 Java 中,则需使用 `SimpleDateFormat` 解析或格式化字符串。以下是具体步骤代码示例: - **在 Oracle SQL 中使用**: - 使用 `TO_CHAR(date_column, 'format')` 函数将期时间值转换为字符串。 - 示例查询:获取当前系统时间并格式化为 `yyyy-MM-dd hh24:mi:ss`。 ```sql SELECT TO_CHAR(SYSDATE, 'yyyy-MM-dd hh24:mi:ss') AS formatted_date FROM dual; -- 输出示例:2023-10-05 14:30:45 ``` - 这里 `SYSDATE` 是 Oracle 的系统期函数,`TO_CHAR` 确保输出符合指定格式[^4]。 - **在 Java 中使用**(处理 Oracle 查询结果): - Java 无法直接使用 `hh24` `mi`,因为其 `SimpleDateFormat` 类采用不同占位符(如 `HH` 表示 24 小时制小时,`mm` 表示分钟)。 - 如果从 Oracle 查询获取到 `yyyy-MM-dd hh24:mi:ss` 格式的字符串,需在 Java 中用 `SimpleDateFormat` 解析为 `Date` 对象或再格式化。 - 示例代码:解析 Oracle 返回的字符串,并转换为 Java 标准格式。 ```java import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; public class DateTimeExample { public static void main(String[] args) { // Oracle 返回的字符串(示例) String oracleDateStr = "2023-10-05 14:30:45"; // 假设这是从 TO_CHAR 查询获得的 // 解析 Oracle 格式的字符串:注意 Java 中需使用 "HH" "mm" SimpleDateFormat oracleFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // Java 解析时用 HH:mm:ss,而非 hh24:mi:ss try { Date date = oracleFormat.parse(oracleDateStr); System.out.println("Parsed Date: " + date); // 再格式化为 Java 标准字符串 SimpleDateFormat javaFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String javaDateStr = javaFormat.format(date); System.out.println("Formatted in Java: " + javaDateStr); // 输出:2023-10-05 14:30:45 } catch (Exception e) { e.printStackTrace(); } } } ``` - 说明:尽管 Oracle 格式包含 `hh24:mi:ss`,但在 Java 解析时,必须调整为 `HH:mm:ss`(`HH` 对应小时,`mm` 对应分钟),因为 `SimpleDateFormat` 不支持 Oracle 的占位符[^2][^3]。 - 如果需要在 Java 中直接生成类似格式,使用 `yyyy-MM-dd HH:mm:ss` 即可,避免混淆[^2]。 #### 4. **注意事项** - **Oracle Java 的差异**:直接在 SQL 查询中使用 Java 格式(如 `yyyy-MM-dd HH:mm:ss`)会导致错误,因为 Oracle 会将 `HH:mm:ss` 中的 `mm` 解释为月份。务必在 Oracle 中用 `TO_CHAR` `hh24:mi:ss` 格式[^1][^4]。 - **大小写敏感**:Oracle 的格式占位符(如 `mi`)是大小写敏感的,`MI` 无效;同样,Java 的 `SimpleDateFormat` 中 `HH` 必须大写表示 24 小时制[^2][^4]。 - **性能考虑**:在 Oracle 中频繁使用 `TO_CHAR` 格式化可能影响查询性能,建议在应用层(如 Java)处理格式化以减少数据库负载。 - **时区问题**:该格式不包含时区信息(如 `yyyy-MM-dd hh24:mi:ss` 默认为数据库时区)。若需处理时区,Oracle 可使用 `FROM_TZ` 函数,Java 可使用 `java.time` 包(如 `Instant` 或 `ZonedDateTime`)[^3]。 通过以上内容,您可以理解 `yyyy-MM-dd hh24:mi:ss` 是 Oracle 特有的期时间格式,适用于数据库查询格式化。结合 Java 使用时,需注意占位符差异以避免常见错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值