日期时间处理函数

昨天根据项目需求,编写时间格式处理的方法,方法需求和代码如下:

/**
 * 需求:
 * 需求背景: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

*/
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值