昨天根据项目需求,编写时间格式处理的方法,方法需求和代码如下:
/**
* 需求:
* 需求背景:TD 在ETL加工过程中,用到getIsoDateC、getIsoTimeC这两个自定义函数,将输入的日期时间字符串转换为统一的标准输出,
转换完成后,日期格式为:YYYY-MM-DD ,时间格式为: hh:mm:ss。由于hive中没有此类内置函数,单纯用SQL实现的话加工比较复杂,代码
冗余,不便于维护。因此需要用Java实现。
输入时间格式如:2017-07-20 13:03:39.250000000 ,2017-07-24 19:30:00,051103 等
加工逻辑:
1、getIsoDateC(inputString)
该函数接受一个输入参数,一个输出。
1)若 inputString 为空,输出为空
2)若 inputString 字符串长度<6 ,则输出为 "1900-01-01"
3)若 inputString 字符串长度=6 ,例如890107,判断inputString第一个字符是否 大于5且小于9,若成立则输出为1989-01-07,若条件不成立则输出为2089-01-07
4)若 inputString 为形如2013/1/2,2013-1-2等其他类型的字符串,则分三步处理。
处理年份:
截取第一次出现'/'或者是'-'的位置以前的字符串,若没有'/'或者是'-',则截取整个字符串,
然后判断截取的字符串,若长度为4,则作为年份,否则年份为“1900”
处理月份:
上一步截取剩余的字符串作为这一步要处理的字符串。
截取第一次出现'/'或者是'-'的位置以前的字符串,若没有'/'或者是'-',则截取整个字符串,
然后判断截取的字符串,若长度为2,则作为月份,若长度为1,则前面补0,如02,否则月份置为01
处理日:
上一步截取剩余的字符串作为这一步要处理的字符串。
截取第一次出现' '(空格)的位置以前的字符串,若没有' ',则截取整个字符串,
然后判断截取的字符串,若长度为2,则作为日,若长度为1,则前面补0,如02,若大于2,则截取前两位,否则置为00
最后将上诉处理得到的年月日拼接为YYYY-MM-DD
加工逻辑:
2、getIsoTimeC(inputString)
该函数接受一个输入参数,一个输出。
1)若 inputString 为空,输出为空
2)截取出现' '(空格)以后的字符串,作为要处理的字符串。
3)若inputString长度<=11,则输出直接置为"00:00:00" ,若>11,则分三步处理时分秒(长度<=11表示没有时间输入)
处理小时:
截取第一次出现":"以前的字符串,若长度为2,则直接作为小时,若长度为1,则前面补0,若长度为0,则直接置为00,若长度大于2,则截取前两位。
处理分钟:
上一步截取剩余的字符串作为这一步要处理的字符串。
截取第一次出现":"以前的字符串,若长度大于2,则分钟置为00,否则取 第一次出现":"以前的字符串 如13:17:27 分钟为17, 13:8:27 分钟为8
处理秒:
取上次处理以后余下的字符串作为这一步要处理的字符串,再截取前两位作为秒 如'2017-07-20 08:40:172345.78' ,处理后的秒为17
*
*
*
*/
public class DateFormat {
public static String getIsoDateC(String dateTime){
if(dateTime == null || "".equals(dateTime)){
return null;
}else{
if(dateTime.length()<6){//字符串长度<6
return "1900-01-01";
}
if(dateTime.length() == 6){//字符串长度=6
String first = dateTime.substring(0, 1);
int first1 = Integer.parseInt(first);
String a1 = dateTime.substring(0, 2);
String a2 = dateTime.substring(2, 4);
String a3 = dateTime.substring(4, 6);
if(first1>5&&first1<9){
String date = "19"+a1+"-"+a2+"-"+a3;
return date;
}else{
String date = "20"+a1+"-"+a2+"-"+a3;
return date;
}
}
if(dateTime.length()>6){
String year;
String month;
String day;
int length;//字符串长度
if(dateTime.indexOf("/")==-1 && dateTime.indexOf("-")==-1){
length = dateTime.length();
if(length == 4){
year = dateTime;
}else{
year = "1900";
}
return "1900-01-01";
}else{
if(dateTime.indexOf("/")!=-1){
int a = dateTime.indexOf("/");
String y = dateTime.substring(0, a);
if(a == 4){
year = y;
}else{
year = "1900";
}
String mm = dateTime.substring(a+1);
if(mm.indexOf("/") != -1){
int a1 = mm.indexOf("/");
if(a1 == 2){
month = mm.substring(0, a1);
}else if(a1 == 1){
month = "0"+mm.substring(0, a1);
}else{
month = "01";
}
String dd = mm.substring(a1+1);
if(dd.indexOf(" ") !=-1){
int a2 = dd.indexOf(" ");
String ddd = dd.substring(0, a2);
if(a2 == 2){
day = ddd;
}else if(a2 == 1){
day = "0"+ddd;
}else if(a2>2){
day = ddd.substring(0, 2);
}else{
day = "00";
}
return year+"-"+month+"-"+day;
}else{
if(dd.length()>0){
int len = dd.length();
if(len ==2){
day = dd;
}else if(len == 1){
day = "0"+dd;
}else if(len>2){
day = dd.substring(0, 2);
}else{
day = "00";
}
return year+"-"+month+"-"+day;
}
}
}else{
int a1 = mm.length();
if(a1 == 2){
month = mm;
}else if(a1 == 1){
month = "0"+mm;
}else{
month = "01";
}
return year+"-"+month+"-00";
}
}
if(dateTime.indexOf("-")!=-1){
int a = dateTime.indexOf("-");
String y = dateTime.substring(0, a);
if(a == 4){
year = y;
}else{
year = "1900";
}
String mm = dateTime.substring(a+1);
if(mm.indexOf("-") != -1){
int a1 = mm.indexOf("-");
if(a1 == 2){
month = mm.substring(0, a1);
}else if(a1 == 1){
month = "0"+mm.substring(0, a1);
}else{
month = "01";
}
String dd = mm.substring(a1+1);
if(dd.indexOf(" ") !=-1){
int a2 = dd.indexOf(" ");
String ddd = dd.substring(0, a2);
if(a2 == 2){
day = ddd;
}else if(a2 == 1){
day = "0"+ddd;
}else if(a2>2){
day = ddd.substring(0, 2);
}else{
day = "00";
}
return year+"-"+month+"-"+day;
}else{
if(dd.length()>0){
int len = dd.length();
if(len ==2){
day = dd;
}else if(len == 1){
day = "0"+dd;
}else if(len>2){
day = dd.substring(0, 2);
}else{
day = "00";
}
return year+"-"+month+"-"+day;
}
}
}else{
int a1 = mm.length();
if(a1 == 2){
month = mm;
}else if(a1 == 1){
month = "0"+mm;
}else{
month = "01";
}
return year+"-"+month+"-00";
}
}
}
}
}
return null;
}
public static String getIsoTimeC(String dateTime){
String h;//时
String m;//分
String s;//秒
if(dateTime == null || "".equals(dateTime)){
return null;
}else{
int a = dateTime.indexOf(" ");
String time = dateTime.substring(a+1);
if(dateTime.length()<=11){
return "00:00:00";
}else{
if(time.indexOf(":")!=-1){
int a1 = time.indexOf(":");
String hh = time.substring(0, a1);
if(a1==2){
h = hh;
}else if(a1==1){
h = "0"+hh;
}else if(a1==0){
h = "00";
}else if(a1>2){
h = hh.substring(0, 2);
}else{
return null;
}
String ms = time.substring(a1+1);
if(ms.indexOf(":")!=-1){
int a2 = ms.indexOf(":");
String mm = ms.substring(0, a2);
if(a2>2){
m = "00";
}else{
m = mm;
}
String ss = ms.substring(a2+1);
if(ss.length()>2){
s = ss.substring(0, 2);
}else{
s = ss;
}
return h+":"+m+":"+s;
}
}
}
}
return null;
}
public static void main(String[] args) {
String dateTime = "2017-12-03 20:18:33222222";
// System.out.println(getIsoDateC(dateTime));
System.out.println(getIsoTimeC(dateTime));
/*
* 测试结果:
*
===============================================================
getIsoDateC(inputString)测试
===============================================================
1. inputString 为空,输出为空的情况
String dateTime = null;
结果
null
String dateTime = "";
结果
null
====================================================================
2. 若 inputString 字符串长度<6 ,则输出为 "1900-01-01"的情况
String dateTime = "22222";
结果
1900-01-01
=====================================================================
3.inputString 字符串长度=6 的情况
String dateTime = "220323";
结果
2022-03-23
String dateTime = "620323";
结果
1962-03-23
======================================================================
4.若 inputString 为形如2013/1/2,2013-1-2等其他类型的字符串
处理年份:
截取第一次出现'/'或者是'-'的位置以前的字符串,若没有'/'或者是'-',则截取整个字符串,
然后判断截取的字符串,若长度为4,则作为年份,否则年份为“1900”
String dateTime = "217-2-3 12:25:33222222";
或者
String dateTime = "217/2/3 12:25:33222222";
结果
1900-02-03
String dateTime = "20017/2/3 12:25:33222222";
或者
String dateTime = "20017-2-3 12:25:33222222";
结果
1900-02-03
String dateTime = "2017/02/03 12:25:33222222";
或者
String dateTime = "2017-02-03 12:25:33222222";
结果
2017-02-03
=======================
处理月份:
上一步截取剩余的字符串作为这一步要处理的字符串。
截取第一次出现'/'或者是'-'的位置以前的字符串,若没有'/'或者是'-',则截取整个字符串,
然后判断截取的字符串,若长度为2,则作为月份,若长度为1,则前面补0,如02,否则月份置为01
String dateTime = "2017/2/03 12:25:33222222";
String dateTime = "2017-2-03 12:25:33222222";
结果
2017-02-03
String dateTime = "2017/12/03 12:25:33222222";
String dateTime = "2017-12-03 12:25:33222222";
结果
2017-12-03
String dateTime = "2017/02/3 12:25:33222222";
或者
String dateTime = "2017-02-3 12:25:33222222";
结果
2017-02-03
String dateTime = "2017-200-3 12:25:33222222";
String dateTime = "2017/200/3 12:25:33222222";
2017-01-03
String dateTime = "2017--3 12:25:33222222";
String dateTime = "2017//3 12:25:33222222";
结果
2017-01-03
===========================================
处理日:
上一步截取剩余的字符串作为这一步要处理的字符串。
截取第一次出现' '(空格)的位置以前的字符串,若没有' ',则截取整个字符串,
然后判断截取的字符串,若长度为2,则作为日,若长度为1,则前面补0,如02,若大于2,则截取前两位,否则置为00
String dateTime = "2017/2/03 12:25:33222222";
String dateTime = "2017-2-03 12:25:33222222";
结果
2017-02-03
String dateTime = "2017/2/3 12:25:33222222";
String dateTime = "2017-2-3 12:25:33222222";
结果
2017-02-03
String dateTime = "2017/02/0223 12:25:33222222";
String dateTime = "2017-02-0223 12:25:33222222";
结果
2017-02-02
String dateTime = "2017-02- 12:25:33222222";
String dateTime = "2017/02/ 12:25:33222222";
结果
2017-02-00
String dateTime = "2017/2/3";
或者
String dateTime = "2017-2-3";
结果
2017-02-03
===========================================================
getIsoTimeC(inputString)测试
===========================================================
1)若 inputString 为空,输出为空
String dateTime = null;
结果
null
String dateTime = "";
结果
null
===============================================================================================================
2)截取出现' '(空格)以后的字符串,作为要处理的字符串。
3)若inputString长度<=11,则输出直接置为"00:00:00" ,若>11,则分三步处理时分秒(长度<=11表示没有时间输入)
String dateTime = "2017/2/3";
或者
String dateTime = "2017-2-3";
结果
00:00:00
=========================================
处理小时:
截取第一次出现":"以前的字符串,若长度为2,则直接作为小时,若长度为1,则前面补0,若长度为0,则直接置为00,若长度大于2,则截取前两位。
String dateTime = "2017-12-03 12:25:33222222";
12:25:33
String dateTime = "2017-12-03 1:25:33222222";
01:25:33
String dateTime = "2017-12-03 0:25:33222222";
00:25:33
String dateTime = "2017-12-03 2235:25:33222222";
22:25:33
String dateTime = "2017-12-03 :25:33222222";
00:25:33
============================================================================================================
处理分钟:
上一步截取剩余的字符串作为这一步要处理的字符串。
截取第一次出现":"以前的字符串,若长度大于2,则分钟置为00,否则取 第一次出现":"以前的字符串 如13:17:27 分钟为17, 13:8:27 分钟为8
String dateTime = "2017-12-03 20:205:33222222";
或者
String dateTime = "2017-12-03 20:2015:33222222";
结果
20:00:33
String dateTime = "2017-12-03 20:18:33222222";
20:18:33
String dateTime = "2017-12-03 20:2:33222222";
20:2:33
String dateTime = "2017-12-03 20:0:33222222";
20:0:33
======================================================================================
处理秒:
取上次处理以后余下的字符串作为这一步要处理的字符串,再截取前两位作为秒 如'2017-07-20 08:40:172345.78' ,处理后的秒为17
String dateTime = "2017-12-03 20:18:33222222";
20:18:33
*/
}
}