DataChange.java 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. package com.steerinfo.dil.util;
  2. import java.math.BigDecimal;
  3. import java.text.DecimalFormat;
  4. import java.text.ParseException;
  5. import java.text.SimpleDateFormat;
  6. import java.util.Date;
  7. import java.util.List;
  8. import java.util.Map;
  9. import java.util.regex.Pattern;
  10. /**
  11. * @ author :TXF
  12. * @ time :2021/8/25 11:25
  13. */
  14. public class DataChange {
  15. /**
  16. * 时间转换类
  17. * 处理了三种类型 yyyy-MM-dd HH:mm:ss yyyy/MM/dd HH:mm:ss 时间戳类型(带毫秒数时间戳13位)
  18. * @param vueDate
  19. * @return
  20. */
  21. public static Date dataToDate(Object vueDate){
  22. if(vueDate instanceof Date){
  23. return (Date) vueDate;
  24. } else {
  25. try {
  26. String str = String.valueOf(vueDate);
  27. if(judgeNumber(str) && str.length() == 13){
  28. return new Date(Long.parseLong(str));
  29. }else if(str.contains("-")){
  30. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  31. return sdf.parse(str);
  32. }else if(str.contains("/")){
  33. SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
  34. return sdf.parse(str);
  35. }
  36. }catch (Exception e){
  37. System.out.println("时间解析错误!返回null");
  38. return null;
  39. }
  40. }
  41. return null;
  42. }
  43. /**
  44. * 判断是否纯数字(不带小数点)仅供上面方法使用
  45. * @param str
  46. * @return
  47. */
  48. public static boolean judgeNumber(String str){
  49. Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
  50. return pattern.matcher(str).matches();
  51. }
  52. /**
  53. * 数据转换成BigDecimal
  54. * @param data
  55. * @return
  56. */
  57. public static BigDecimal dataToBigDecimal(Object data){
  58. if (data != null){
  59. if(data instanceof BigDecimal){
  60. return (BigDecimal) data;
  61. }else{
  62. String str = String.valueOf(data);
  63. BigDecimal decimal = null;
  64. if(!"".equals(str)){
  65. try {
  66. decimal = new BigDecimal(str);
  67. } catch (Exception e) {
  68. System.out.println(data + ":数据解析失败!返回0");
  69. return new BigDecimal(0);
  70. }
  71. }
  72. return decimal;
  73. }
  74. }
  75. return new BigDecimal(0);
  76. }
  77. /**
  78. * 将时间截取到天 为字符串类型 用于前端只显示到天
  79. * @param date 传入时间
  80. * @return
  81. */
  82. public static String dateToDayDate(Object date){
  83. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  84. Date changeDate = null;
  85. if(date == null)
  86. return null;
  87. try{
  88. changeDate = (Date) date;
  89. }catch (Exception e){
  90. e.printStackTrace();
  91. }
  92. return sdf.format(changeDate);
  93. }
  94. /**
  95. * 遍历从数据库中传进来的数据
  96. * @param list 从数据库查询出来的list数据列表
  97. * @param key map中多个需要转换的date参数
  98. */
  99. public static void changeDateToDayDate(List<Map<String, Object>> list, String ...key){
  100. //遍历List
  101. for (Map<String, Object> map : list) {
  102. for (String s : key) {
  103. //从map中取 date的值 并转换成字符串类型的日期
  104. String stringDate = dateToDayDate(map.get(s));
  105. if(stringDate.length() == 0){
  106. break;
  107. }else {
  108. //修改map中的值
  109. map.put(s, stringDate);
  110. }
  111. }
  112. }
  113. }
  114. /**
  115. * 遍历列表使只显示两位小数
  116. * @param list
  117. * @param key
  118. */
  119. public static void dataTo2Number(List<Map<String, Object>> list, String ...key){
  120. DecimalFormat df = new DecimalFormat("0.00");
  121. //遍历List
  122. for (Map<String, Object> map : list) {
  123. for (String s : key) {
  124. //修改数据为带两位小数
  125. try {
  126. BigDecimal oldDate = dataToBigDecimal(map.get(s));
  127. String resultDeduction = df.format(oldDate.doubleValue());
  128. map.put(s, resultDeduction);
  129. } catch (Exception e) {
  130. System.out.println("原料扣减量数据有误");
  131. }
  132. }
  133. }
  134. }
  135. /**
  136. * 计算相差时间 日时分秒
  137. * @param
  138. * @return
  139. */
  140. public static String calculatedTimeDifference(Date time1, Date time2){
  141. long t1 = time1.getTime();
  142. long t2 = time2.getTime();
  143. if(t1 > t2){
  144. long temp = t1;
  145. t1 = t2;
  146. t2 = temp;
  147. }
  148. long between = t2 - t1;
  149. long day = between / (24 * 60 * 60 * 1000);
  150. long hour = (between / (60 * 60 * 1000) - day * 24);
  151. long min = ((between / (60 * 1000)) - day * 24 * 60 - hour * 60);
  152. long s = (between / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
  153. return day + "天"+ + hour+ "时" + min + "分" + s + "秒";
  154. }
  155. /**
  156. * 生成带时间的八位数顺序号
  157. * @param start 前缀
  158. * @param id 顺序号 主键Id
  159. * @return
  160. */
  161. public static String generateEightDigitsNumber(String start, Integer id){
  162. SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
  163. StringBuilder sb = new StringBuilder(start + sdf.format(new Date()));
  164. sb.append(
  165. id < 10
  166. ? "0000000" + id : id < 100
  167. ? "000000" + id : id < 1000
  168. ? "00000" + id : id < 10000
  169. ? "0000" + id : id < 100000
  170. ? "000" + id : id < 1000000
  171. ? "00" + id : id < 10000000
  172. ? "0" + id : id.toString()
  173. );
  174. return sb.toString();
  175. }
  176. /**
  177. * 根据时间段查询数据 支持只选择单个时间
  178. * @Author TXF
  179. * @Date 2022/1/10 23:21
  180. * @param startTime
  181. * @param endTime
  182. * @param map
  183. * @param sdf
  184. * @return
  185. **/
  186. public static void queryDataByDate(String startTime, String endTime, Map<String, Object> map, SimpleDateFormat sdf){
  187. if (startTime != null && !"null".equals(startTime) && endTime != null && !"null".equals(endTime)) {
  188. map.put("startDate", sdf.format(new Date(Long.parseLong(startTime))));
  189. map.put("endDate", sdf.format(new Date(Long.parseLong(endTime) + 86400000)));
  190. } else if (startTime != null && !"null".equals(startTime)) {
  191. map.put("oneDate", sdf.format(new Date(Long.parseLong(startTime))));
  192. } else if (endTime != null && !"null".equals(endTime)) {
  193. map.put("oneDate", sdf.format(new Date(Long.parseLong(endTime))));
  194. } else {
  195. map.put("oneDate", sdf.format(new Date()));
  196. }
  197. }
  198. /**
  199. * 只支持两个时间查询
  200. * @Author TXF
  201. * @Date 2022/1/15 9:08
  202. * @param startTime
  203. * @param endTime
  204. * @param sdf
  205. * @return
  206. **/
  207. public static void queryDataByDateTime(String startTime, String endTime, Map<String, Object> map,SimpleDateFormat sdf){
  208. SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd");
  209. if (startTime != null && !"null".equals(startTime) && endTime != null && !"null".equals(endTime)) {
  210. map.put("startDate", sdf.format(new Date(Long.parseLong(startTime))));
  211. map.put("endDate", sdf.format(new Date(Long.parseLong(endTime))));
  212. }
  213. //如果开始时间和结束时间有且只有一个为空 则只查那天的数据
  214. else if((startTime != null && !"null".equals(startTime)) || (endTime != null && !"null".equals(endTime))){
  215. if(startTime != null && !"null".equals(startTime)){
  216. queryDataByTwoDateSon(map, startTime, sdfDate);
  217. }
  218. if(endTime != null && !"null".equals(endTime)){
  219. queryDataByTwoDateSon(map, endTime, sdfDate);
  220. }
  221. }else {
  222. //如果两者时间都为空,则查询当天数据
  223. String nowDate = sdfDate.format(new Date());
  224. map.put("oneDate", nowDate + " 00:00:00");
  225. }
  226. }
  227. /**
  228. * 上面方法的儿子方法 如果只传入了一个时间 则查询那天的数据
  229. * @Author TXF
  230. * @Date 2022/1/17 16:17
  231. * @param map
  232. * @param time
  233. * @param sdfDate
  234. * @return
  235. **/
  236. private static void queryDataByTwoDateSon(Map<String, Object> map, String time, SimpleDateFormat sdfDate){
  237. Date date1 = new Date(Long.parseLong(time));
  238. Date date2 = new Date(Long.parseLong(time) + 86400000);
  239. String dayStartTime = sdfDate.format(date1);
  240. String dayEndTime = sdfDate.format(date2);
  241. map.put("startDate", dayStartTime + " 00:00:00");
  242. map.put("endDate", dayEndTime + " 00:00:00");
  243. }
  244. }