DataChange.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  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. public static String generateEightDigitsNumber(String start, Integer id,String pot){
  177. SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
  178. StringBuilder sb = new StringBuilder(start + pot + sdf.format(new Date()) + pot);
  179. sb.append(
  180. id < 10
  181. ? "0000000" + id : id < 100
  182. ? "000000" + id : id < 1000
  183. ? "00000" + id : id < 10000
  184. ? "0000" + id : id < 100000
  185. ? "000" + id : id < 1000000
  186. ? "00" + id : id < 10000000
  187. ? "0" + id : id.toString()
  188. );
  189. return sb.toString();
  190. }
  191. /**
  192. * 根据时间段查询数据 支持只选择单个时间
  193. * @Author TXF
  194. * @Date 2022/1/10 23:21
  195. * @param startTime
  196. * @param endTime
  197. * @param map
  198. * @param sdf
  199. * @return
  200. **/
  201. public static void queryDataByDate(String startTime, String endTime, Map<String, Object> map, SimpleDateFormat sdf){
  202. if (startTime != null && !"null".equals(startTime) && endTime != null && !"null".equals(endTime)) {
  203. map.put("startDate", sdf.format(new Date(Long.parseLong(startTime))));
  204. map.put("endDate", sdf.format(new Date(Long.parseLong(endTime) + 86400000)));
  205. } else if (startTime != null && !"null".equals(startTime)) {
  206. map.put("oneDate", sdf.format(new Date(Long.parseLong(startTime))));
  207. } else if (endTime != null && !"null".equals(endTime)) {
  208. map.put("oneDate", sdf.format(new Date(Long.parseLong(endTime))));
  209. } else {
  210. map.put("oneDate", sdf.format(new Date()));
  211. }
  212. }
  213. /**
  214. * 只支持两个时间查询
  215. * @Author TXF
  216. * @Date 2022/1/15 9:08
  217. * @param startTime
  218. * @param endTime
  219. * @param sdf
  220. * @return
  221. **/
  222. public static void queryDataByDateTime(String startTime, String endTime, Map<String, Object> map,SimpleDateFormat sdf){
  223. SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd");
  224. if (startTime != null && !"null".equals(startTime) && endTime != null && !"null".equals(endTime)) {
  225. map.put("startDate", sdf.format(new Date(Long.parseLong(startTime))));
  226. map.put("endDate", sdf.format(new Date(Long.parseLong(endTime))));
  227. }
  228. //如果开始时间和结束时间有且只有一个为空 则只查那天的数据
  229. else if((startTime != null && !"null".equals(startTime)) || (endTime != null && !"null".equals(endTime))){
  230. if(startTime != null && !"null".equals(startTime)){
  231. queryDataByTwoDateSon(map, startTime, sdfDate);
  232. }
  233. if(endTime != null && !"null".equals(endTime)){
  234. queryDataByTwoDateSon(map, endTime, sdfDate);
  235. }
  236. }else {
  237. //如果两者时间都为空,则查询当天数据
  238. String nowDate = sdfDate.format(new Date());
  239. map.put("oneDate", nowDate + " 00:00:00");
  240. }
  241. }
  242. /**
  243. * 上面方法的儿子方法 如果只传入了一个时间 则查询那天的数据
  244. * @Author TXF
  245. * @Date 2022/1/17 16:17
  246. * @param map
  247. * @param time
  248. * @param sdfDate
  249. * @return
  250. **/
  251. private static void queryDataByTwoDateSon(Map<String, Object> map, String time, SimpleDateFormat sdfDate){
  252. Date date1 = new Date(Long.parseLong(time));
  253. Date date2 = new Date(Long.parseLong(time) + 86400000);
  254. String dayStartTime = sdfDate.format(date1);
  255. String dayEndTime = sdfDate.format(date2);
  256. map.put("startDate", dayStartTime + " 00:00:00");
  257. map.put("endDate", dayEndTime + " 00:00:00");
  258. }
  259. /**
  260. * 只支持两个时间查询
  261. * @Author TXF
  262. * @Date 2022/1/15 9:08
  263. * @param startTime
  264. * @param endTime
  265. * @param sdf
  266. * @return
  267. **/
  268. public static void queryDataByDateTimeYestDay(String startTime, String endTime, Map<String, Object> map,SimpleDateFormat sdf){
  269. SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd");
  270. if (startTime != null && !"null".equals(startTime) && endTime != null && !"null".equals(endTime)) {
  271. map.put("startDate", sdf.format(new Date(Long.parseLong(startTime))));
  272. map.put("endDate", sdf.format(new Date(Long.parseLong(endTime))));
  273. }
  274. //如果开始时间和结束时间有且只有一个为空 则只查那天的数据
  275. else if((startTime != null && !"null".equals(startTime)) || (endTime != null && !"null".equals(endTime))){
  276. if(startTime != null && !"null".equals(startTime)){
  277. queryDataByTwoDateSon(map, startTime, sdfDate);
  278. }
  279. if(endTime != null && !"null".equals(endTime)){
  280. queryDataByTwoDateSon(map, endTime, sdfDate);
  281. }
  282. }else {
  283. //如果两者时间都为空,则查询当天和昨天数据
  284. String yesDate = sdfDate.format(new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 24));
  285. map.put("oneDate", yesDate + " 08:00:00");
  286. }
  287. }
  288. }