PsDateTime.java 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. package com.persagy.fm.common.lang;
  2. import org.apache.commons.lang3.StringUtils;
  3. import java.time.LocalDateTime;
  4. import java.time.ZonedDateTime;
  5. import java.time.format.DateTimeFormatter;
  6. import java.util.Calendar;
  7. import java.util.Date;
  8. /**
  9. * 自定日期时间类,用于转化表示日期时间串等
  10. * @author Charlie Yu
  11. * @version 1.0 2021-04-08
  12. */
  13. public class PsDateTime extends PsDate implements Comparable<PsDate> {
  14. /** 序列化id */
  15. private static final long serialVersionUID = 7280791980952901691L;
  16. /** 日期格式化对象 */
  17. public static DateTimeFormatter DEFAULT_FORMAT = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
  18. /** 自定义日期时间无参构造方法。 */
  19. public PsDateTime() {
  20. super();
  21. }
  22. /**
  23. * 通过毫秒数构造自定义日期时间对象
  24. * (以从1970年1月1日0时0分0秒到现在的毫秒数来构造日期)
  25. * @param millis 毫秒数
  26. */
  27. public PsDateTime(long millis) {
  28. super(millis);
  29. }
  30. /**
  31. * 通过日期对象构造自定义日期时间对象
  32. * @param date 日期对象
  33. */
  34. public PsDateTime(Date date) {
  35. super(date);
  36. }
  37. /**
  38. * 通过自定义日期对象构造自定义日期时间对象
  39. * @param date 日期对象
  40. */
  41. public PsDateTime(PsDate date) {
  42. super(date.getMillis());
  43. }
  44. /**
  45. * 通过自定义日期对象和时间对象构造自定义日期时间对象
  46. * @param date 日期对象
  47. */
  48. public PsDateTime(PsDate date, PsTime time) {
  49. super(date.getMillis() + time.getMillis());
  50. }
  51. /**
  52. * 通过默认形式日期串构造自定义日期对象
  53. * @param date 默认格式日期串
  54. */
  55. public PsDateTime(String date) {
  56. super(date, DEFAULT_FORMAT);
  57. }
  58. /**
  59. * 通过日期串和指定的格式化串构造自定义日期时间对象
  60. * @param date 符合格式串的日期时间对象
  61. * @param format 日期格式化串
  62. */
  63. public PsDateTime(String date, String format) {
  64. super(date, format);
  65. }
  66. /**
  67. * 通过日期串和指定的格式化对象构造自定义日期时间对象
  68. * @param date 符合格式化对象的日期时间对象
  69. * @param dateFormat 格式化对象
  70. */
  71. public PsDateTime(String date, DateTimeFormatter dateFormat) {
  72. super(date, dateFormat);
  73. }
  74. /**
  75. * 用日期对象初始化对象
  76. */
  77. @Override
  78. protected void init() {
  79. set(Calendar.MILLISECOND, 0);
  80. }
  81. @Override
  82. protected void parse(String date, DateTimeFormatter dateFormat) {
  83. if (StringUtils.isEmpty(date)) {
  84. return;
  85. }
  86. if (dateFormat == null) {
  87. dateFormat = DEFAULT_FORMAT;
  88. }
  89. LocalDateTime localDate = LocalDateTime.parse(date, dateFormat);
  90. ZonedDateTime zdt = localDate.atZone(PsDate.DEFAULT_ZONE_ID);
  91. setDate(Date.from(zdt.toInstant()));
  92. }
  93. /**
  94. * 根据对象构建自定义日期时间对象
  95. * @param obj 对象
  96. * @return 自定义日期时间对象
  97. */
  98. public static PsDateTime parsePsDateTime(Object obj) {
  99. if (obj == null || "".equals(obj.toString())) {
  100. return null;
  101. }
  102. if (obj instanceof PsDate) {
  103. return new PsDateTime(((PsDate) obj).getMillis());
  104. }
  105. if (obj instanceof Date) {
  106. return new PsDateTime((Date) obj);
  107. }
  108. if (obj instanceof Integer) {
  109. return new PsDateTime(((Integer) obj).longValue() * 1000);
  110. }
  111. if (obj instanceof Number) {
  112. return new PsDateTime(((Number) obj).longValue());
  113. }
  114. // if (NumberUtils.isCreatable(obj.toString())) {
  115. // return new PsDateTime(NumberUtils.toLong(obj.toString()));
  116. // }
  117. return new PsDateTime(obj.toString());
  118. }
  119. /**
  120. * 取得自定义日期时间对象中的自定义日期对象
  121. * @return 自定义日期对象
  122. */
  123. public PsDate getDDate() {
  124. return new PsDate(getMillis());
  125. }
  126. /**
  127. * 取得自定义日期时间对象中的自定义时间对象
  128. * @return 自定义时间对象
  129. */
  130. public PsTime getDTime() {
  131. return new PsTime(getMillis());
  132. }
  133. /**
  134. * 返回指定天数之后的自定义日期时间对象
  135. */
  136. @Override
  137. public PsDateTime getDateAfter(int days) {
  138. return new PsDateTime(getMillis() + MILLIS_PER_DAY * days);
  139. }
  140. /**
  141. * 返回指定天数之前的自定义日期时间对象
  142. */
  143. @Override
  144. public PsDateTime getDateBefore(int days) {
  145. return getDateAfter(-days);
  146. }
  147. /**
  148. * 取得两个日期时间对象相差的小时数
  149. * @param begin 开始日期时间
  150. * @param end 结束日期时间
  151. * @return 小时数
  152. */
  153. public static int getHoursBetween(PsDateTime begin, PsDateTime end) {
  154. return (int) (end.getMillis() / PsDate.MILLIS_PER_HOUR - begin.getMillis() / PsDate.MILLIS_PER_HOUR);
  155. }
  156. /**
  157. * 取得两个日期时间对象相差的分钟数
  158. * @param begin 开始日期时间
  159. * @param end 结束日期时间
  160. * @return 分钟数
  161. */
  162. public static int getMinutesBetween(PsDateTime begin, PsDateTime end) {
  163. return (int) (end.getMillis() / PsDate.MILLIS_PER_MINUTE - begin.getMillis() / PsDate.MILLIS_PER_MINUTE);
  164. }
  165. /**
  166. * 取得两个日期时间对象相差的秒数
  167. * @param begin 开始日期时间
  168. * @param end 结束日期时间
  169. * @return 秒数
  170. */
  171. public static int getSecondsBetween(PsDateTime begin, PsDateTime end) {
  172. return (int) (end.getMillis() / PsDate.MILLIS_PER_SECOND - begin.getMillis() / PsDate.MILLIS_PER_SECOND);
  173. }
  174. /**
  175. * 取得两个日期时间对象相差的毫秒数
  176. * @param begin 开始日期时间
  177. * @param end 结束日期时间
  178. * @return 毫秒数
  179. */
  180. private static long getMillisBetween(PsDateTime begin, PsDateTime end) {
  181. if (begin == null || end == null) {
  182. return 0;
  183. }
  184. return end.getMillis() - begin.getMillis();
  185. }
  186. /**
  187. * 取得当前日期时间对象在指定的日期时间对象之后多少毫秒
  188. * @param dateTime 要比较的自定义日期时间
  189. * @return 当前时间在给定日期时间
  190. */
  191. public long getMillisAfter(PsDateTime dateTime) {
  192. return getMillisBetween(dateTime, this);
  193. }
  194. /**
  195. * 取得小时数
  196. * @return 小时数
  197. */
  198. public int getHour() {
  199. return get(Calendar.HOUR_OF_DAY);
  200. }
  201. /**
  202. * 取得小时数字符串
  203. * @return 小时数字符串
  204. */
  205. public String getHOUR() {
  206. return formatNumber(getHour());
  207. }
  208. /**
  209. * 取得分钟数
  210. * @return 分钟数
  211. */
  212. public int getMinute() {
  213. return get(Calendar.MINUTE);
  214. }
  215. /**
  216. * 取得分钟数字符串
  217. * @return 分钟数字符串
  218. */
  219. public String getMINUTE() {
  220. return formatNumber(getMinute());
  221. }
  222. /**
  223. * 取得秒数
  224. * @return 秒数
  225. */
  226. public int getSecond() {
  227. return get(Calendar.SECOND);
  228. }
  229. /**
  230. * 取得秒数字符串
  231. * @return 秒数字符串
  232. */
  233. public String getSECOND() {
  234. return formatNumber(getSecond());
  235. }
  236. /**
  237. * 取得毫秒数
  238. * @return 毫秒数
  239. */
  240. public int getMilliSecond() {
  241. return get(Calendar.MILLISECOND);
  242. }
  243. /**
  244. * 取得毫秒数串
  245. * @return 毫秒数串
  246. */
  247. public String getMILLISECOND() {
  248. int ms = getMilliSecond();
  249. return Integer.toString(ms + 1000).substring(1);
  250. }
  251. /**
  252. * 实现比较接口方法
  253. * @see Comparable#compareTo(Object)
  254. */
  255. @Override
  256. public int compareTo(PsDate psDate) {
  257. return calendar.compareTo(psDate.calendar);
  258. }
  259. /**
  260. * 比较日期是否相等
  261. * @param o 比较的对象
  262. * @return 布尔值
  263. */
  264. @Override
  265. public boolean equals(Object o) {
  266. if ((o != null) && (o instanceof PsDate)) {
  267. return this.getMillis() == ((PsDate) o).getMillis();
  268. }
  269. return false;
  270. }
  271. /**
  272. * 用默认的格式化串转化日期时间
  273. * @see Object#toString()
  274. */
  275. @Override
  276. public String toString() {
  277. return toString(DEFAULT_FORMAT);
  278. }
  279. @Override
  280. public String toString(DateTimeFormatter dateFormat) {
  281. if (dateFormat == null) {
  282. return toString();
  283. }
  284. return dateFormat.format(getDate().toInstant().atZone(PsDate.DEFAULT_ZONE_ID));
  285. }
  286. }