Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
769aa54b
提交
769aa54b
authored
9 年前
作者:
Patrick Brielmayer
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Improvements
Fixed misspelling Renamed ToDateParams to ToDateParser Code cleanup
上级
d1514e17
全部展开
显示空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
81 行增加
和
193 行删除
+81
-193
DateTimeUtils.java
h2/src/main/org/h2/util/DateTimeUtils.java
+0
-54
ToDate.java
h2/src/main/org/h2/util/ToDate.java
+5
-49
ToDateParser.java
h2/src/main/org/h2/util/ToDateParser.java
+52
-12
ToDateTokenizer.java
h2/src/main/org/h2/util/ToDateTokenizer.java
+24
-78
没有找到文件。
h2/src/main/org/h2/util/DateTimeUtils.java
浏览文件 @
769aa54b
...
...
@@ -10,7 +10,6 @@ package org.h2.util;
import
java.sql.Date
;
import
java.sql.Time
;
import
java.sql.Timestamp
;
import
java.text.ParseException
;
import
java.text.SimpleDateFormat
;
import
java.util.*
;
...
...
@@ -581,59 +580,6 @@ public class DateTimeUtils {
}
}
@SuppressWarnings
(
"serial"
)
private
static
final
Map
<
String
,
String
>
DATE_FORMAT_REGEXPS
=
new
HashMap
<
String
,
String
>()
{
{
put
(
"^\\d{8}[^\\d]*"
,
"yyyyMMdd"
);
put
(
"^\\d{1,2}\\.\\d{1,2}\\.\\d{4}[^\\d]*"
,
"dd.MM.yyyy"
);
put
(
"^\\d{4}\\.\\d{1,2}\\.\\d{1,2}[^\\d]*"
,
"yyyy.MM.dd"
);
put
(
"^\\d{4}-\\d{1,2}-\\d{1,2}[^\\d]*"
,
"yyyy-MM-dd"
);
put
(
"^\\d{1,2}-\\d{1,2}-\\d{4}[^\\d]*"
,
"dd-MM-yyyy"
);
put
(
"^\\d{1,2}/\\d{1,2}/\\d{4}[^\\d]*"
,
"dd/MM/yyyy"
);
put
(
"^\\d{4}/\\d{1,2}/\\d{1,2}[^\\d]*"
,
"yyyy/MM/dd"
);
put
(
"^\\d{1,2}/\\d{1,2}/\\d{4}[^\\d]*"
,
"dd/MM/yyyy"
);
put
(
"^\\d{1,2}-[^\\d]{3}-\\d{4}[^\\d]*"
,
"dd-MMM-yyyy"
);
put
(
"^\\d{4}-[^\\d]{3}-\\d{1,2}[^\\d]*"
,
"yyyy-MMM-dd"
);
put
(
"^.{2}\\s.{3}\\s\\d{1,2}\\s\\d{1,2}\\:\\d{1,2}\\:\\d{1,2}\\s.{3}\\s\\d{4}$"
,
"EEE MMM dd hh:mm:ss z yyyy"
);
}
};
/**
* Determine SimpleDateFormat pattern matching with the given date string. Returns null if format is unknown. You can
* simply extend DateUtil with more formats if needed.
*
* @param dateString
* The date string to determine the SimpleDateFormat pattern for.
* @return The matching SimpleDateFormat pattern, or null if format is unknown.
*/
private
static
String
determineDateFormat
(
final
String
dateString
)
{
for
(
String
regexp
:
DATE_FORMAT_REGEXPS
.
keySet
())
{
if
(
dateString
.
toLowerCase
().
matches
(
regexp
))
{
return
DATE_FORMAT_REGEXPS
.
get
(
regexp
);
}
}
return
null
;
// Unknown format.
}
/**
* Parse date-string in "Best Effort" (BE) manner.
* Uses a predefined list of date patterns to parse a string into a date.
*/
public
static
java
.
util
.
Date
parseDateBestEffort
(
final
String
dateStr
)
{
String
dateFormat
=
determineDateFormat
(
dateStr
);
if
(
dateFormat
==
null
)
{
// The source does not contain a date that can be parsed.
throw
DbException
.
get
(
ErrorCode
.
PARSE_ERROR_1
,
"Invalid date. "
+
dateStr
);
}
SimpleDateFormat
formatter
=
new
SimpleDateFormat
(
dateFormat
);
try
{
return
formatter
.
parse
(
dateStr
);
}
catch
(
ParseException
e
)
{
throw
DbException
.
get
(
ErrorCode
.
PARSE_ERROR_1
,
e
,
"Invalid date. "
+
dateStr
);
}
}
/**
* Parses a date using a format string.
*
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/util/ToDate.java
浏览文件 @
769aa54b
package
org
.
h2
.
util
;
import
java.sql.Timestamp
;
import
java.util.List
;
import
org.h2.util.ToDateTokenizer.FormatTokenEnum
;
import
java.util.Date
;
/**
* Emulates Oracle's TO_DATE function.<br>
* Main class
*/
public
class
ToDate
{
public
enum
ToDateFunctionName
{
TO_DATE
(
"DD MON YYYY"
),
TO_TIMESTAMP
(
"DD MON YYYY HH:MI:SS"
);
private
final
String
defaultFormatStr
;
ToDateFunctionName
(
final
String
defaultFormatStr
)
{
this
.
defaultFormatStr
=
defaultFormatStr
;
}
String
getDefaultFormatStr
()
{
return
defaultFormatStr
;
}
};
public
static
Timestamp
TO_DATE
(
final
String
input
,
final
String
format
)
{
ToDatePar
ams
parsed
=
parse
(
new
ToDateParams
(
ToDateFunctionName
.
TO_DATE
,
input
,
format
)
);
return
parse
d
.
getResultingTimestamp
();
ToDatePar
ser
parser
=
ToDateParser
.
toDate
(
input
,
format
);
return
parse
r
.
getResultingTimestamp
();
}
public
static
Timestamp
TO_TIMESTAMP
(
final
String
input
,
final
String
format
)
{
ToDatePar
ams
parsed
=
parse
(
new
ToDateParams
(
ToDateFunctionName
.
TO_TIMESTAMP
,
input
,
format
)
);
return
parse
d
.
getResultingTimestamp
();
ToDatePar
ser
parser
=
ToDateParser
.
toTimestamp
(
input
,
format
);
return
parse
r
.
getResultingTimestamp
();
}
/**
* Parse the format-string with passed token of {@link FormatTokenEnum}}.<br>
* if token matches return true otherwise false.
*/
private
static
ToDateParams
parse
(
final
ToDateParams
p
)
{
while
(
p
.
hasToParseData
())
{
List
<
FormatTokenEnum
>
tokenList
=
FormatTokenEnum
.
getTokensInQuestion
(
p
);
if
(
tokenList
.
isEmpty
())
{
p
.
removeFirstChar
();
continue
;
}
boolean
foundAnToken
=
false
;
for
(
FormatTokenEnum
token
:
tokenList
)
{
if
(
token
.
parseFormatStrWithToken
(
p
))
{
foundAnToken
=
true
;
break
;
}
}
if
(!
foundAnToken
)
{
p
.
removeFirstChar
();
continue
;
}
}
return
p
;
}
}
\ No newline at end of file
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/util/ToDatePar
ams
.java
→
h2/src/main/org/h2/util/ToDatePar
ser
.java
浏览文件 @
769aa54b
...
...
@@ -2,31 +2,53 @@ package org.h2.util;
import
static
java
.
lang
.
String
.
format
;
import
java.sql.Date
;
import
java.sql.Timestamp
;
import
java.util.Calendar
;
import
org.h2.util.ToDate.ToDateFunctionName
;
import
java.util.Date
;
import
java.util.List
;
/**
* Emulates Oracle's TO_DATE function.<br>
* This class holds and handles the input data form the TO_DATE-method
*/
class
ToDatePar
ams
{
class
ToDatePar
ser
{
private
final
String
unmodifiedInputStr
;
private
final
String
unmodifiedFormatStr
;
private
final
ToDateFunctionName
functionName
;
private
final
ConfigParam
functionName
;
private
String
inputStr
;
private
String
formatStr
;
private
final
Calendar
resultCalendar
=
(
Calendar
)
Calendar
.
getInstance
().
clone
();
private
Integer
nanos
=
null
;
private
enum
ConfigParam
{
TO_DATE
(
"DD MON YYYY"
),
TO_TIMESTAMP
(
"DD MON YYYY HH:MI:SS"
);
private
final
String
defaultFormatStr
;
ConfigParam
(
final
String
defaultFormatStr
)
{
this
.
defaultFormatStr
=
defaultFormatStr
;
}
String
getDefaultFormatStr
()
{
return
defaultFormatStr
;
}
}
static
ToDateParser
toDate
(
final
String
input
,
final
String
format
)
{
ToDateParser
result
=
new
ToDateParser
(
ConfigParam
.
TO_DATE
,
input
,
format
);
parse
(
result
);
return
result
;
}
static
ToDateParser
toTimestamp
(
final
String
input
,
final
String
format
)
{
ToDateParser
result
=
new
ToDateParser
(
ConfigParam
.
TO_TIMESTAMP
,
input
,
format
);
parse
(
result
);
return
result
;
}
/**
* @param input the input date with the date-time info
* @param format the format of date-time info
* @param functionName one of [TO_DATE, TO_TIMESTAMP] (both share the same code)
*/
ToDatePar
ams
(
final
ToDateFunctionName
functionName
,
final
String
input
,
final
String
format
)
{
ToDatePar
ser
(
final
ConfigParam
functionName
,
final
String
input
,
final
String
format
)
{
// reset calendar - default oracle behaviour
resultCalendar
.
set
(
Calendar
.
YEAR
,
1970
);
resultCalendar
.
set
(
Calendar
.
MONTH
,
Calendar
.
getInstance
().
get
(
Calendar
.
MONTH
));
...
...
@@ -52,10 +74,6 @@ class ToDateParams {
unmodifiedFormatStr
=
formatStr
;
// Keep a copy
}
Date
getResultingDate
()
{
return
new
Date
(
getResultCalendar
().
getTimeInMillis
());
}
Timestamp
getResultingTimestamp
()
{
Calendar
cal
=
(
Calendar
)
getResultCalendar
().
clone
();
int
nanosToSet
=
nanos
==
null
?
cal
.
get
(
Calendar
.
MILLISECOND
)
*
1000000
:
nanos
.
intValue
();
...
...
@@ -77,8 +95,8 @@ class ToDateParams {
return
formatStr
;
}
ToDateFunctionName
getFunctionName
()
{
return
functionName
;
String
getFunctionName
()
{
return
functionName
.
name
()
;
}
void
setNanos
(
final
int
nanos
)
{
...
...
@@ -98,6 +116,28 @@ class ToDateParams {
}
}
private
static
ToDateParser
parse
(
final
ToDateParser
p
)
{
while
(
p
.
hasToParseData
())
{
List
<
ToDateTokenizer
.
FormatTokenEnum
>
tokenList
=
ToDateTokenizer
.
FormatTokenEnum
.
getTokensInQuestion
(
p
.
getFormatStr
());
if
(
tokenList
.
isEmpty
())
{
p
.
removeFirstChar
();
continue
;
}
boolean
foundAnToken
=
false
;
for
(
ToDateTokenizer
.
FormatTokenEnum
token
:
tokenList
)
{
if
(
token
.
parseFormatStrWithToken
(
p
))
{
foundAnToken
=
true
;
break
;
}
}
if
(!
foundAnToken
)
{
p
.
removeFirstChar
();
continue
;
}
}
return
p
;
}
void
remove
(
final
String
toIgnore
)
{
if
(
toIgnore
!=
null
)
{
int
trimLeng
=
toIgnore
.
length
();
...
...
This diff is collapsed.
Click to expand it.
h2/src/main/org/h2/util/ToDateTokenizer.java
浏览文件 @
769aa54b
差异被折叠。
点击展开。
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论