All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jn.langx.util.Dates Maven / Gradle / Ivy

Go to download

Java lang extensions for java6+, a supplement to , replacement of a Guava, commons-lang. Core utilities, Collection utilities, IO utilities, Cache, Configuration library ...

There is a newer version: 4.8.2
Show newest version
package com.jn.langx.util;

import com.jn.langx.annotation.NonNull;
import com.jn.langx.annotation.Nullable;
import com.jn.langx.util.concurrent.threadlocal.GlobalThreadLocalMap;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

/**
 * https://www.iso.org/obp/ui#iso:std:iso:8601:-1:ed-1:v1:en
 * 

*

* 标准时间:GMT时间,也叫格林威治平时,也叫 UTC时间。 * Java 6 : *

*

 * Date:
 * 表示一个瞬时值,单位是毫秒。它的结果是一个标准的GMT瞬时值。它和时区(timezone)地域(Locale)没有关系。
 * 在同一时刻,地球上两个不同时区国家的人使用Date API获取到的毫秒数完全一样的。
 *
 * Timezone:
 * 表示时区,其实是各个时区与GMT的毫秒数之差, 也即Offset。
 * 因为不同时区的时间看到的是不一样的,但是通过Date获取到的毫秒数是一样的,怎么做到的呢?
 * Date#toString 或者 SimpleDateFormat 都会根据Timezone 和 Locale 来进行处理,具体处理如下:
 *    1) 使用GMT 毫秒数 + Timezone.offset 计算出当地的实际毫秒数
 *    2) 格式化显示时会使用本土语言(Locale)进行处理
 *
 * Calender:
 *  日历,它综合了 GMT millis(Date), timezone, locale,也就是说它是用来表示某个时区的某个国家的时间。
 *  并在此基础上提供了时间的加减运算。
 *  setTimeInMillis,setTimeInMillis 这两个方法的参数或者返回值是 UTC millis。
 *  提供的时间的加减运算都是针对 Locale Time的。
 *
 * SimpleDateFormat 又是基于Calender(即基于 GMT millis(Date), timezone, locale)的一个日期格式化工具
 * Pattern 涉及的符号:https://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html
 * 
*/ public class Dates { public static final int MINUTES_TO_SECONDS = 60; public static final int HOURS_TO_SECONDS = 60 * MINUTES_TO_SECONDS; public static final int DAY_TO_SECONDS = 24 * HOURS_TO_SECONDS; public static final long SECONDS_TO_MILLIS = 1000; public static final long MINUTES_TO_MILLIS = MINUTES_TO_SECONDS * SECONDS_TO_MILLIS; public static final long HOURS_TO_MILLIS = HOURS_TO_SECONDS * SECONDS_TO_MILLIS; public static final long DAY_TO_MILLIS = DAY_TO_SECONDS * SECONDS_TO_MILLIS; public static final String yyyy_MM_dd_HH_mm_ss = "yyyy-MM-dd HH:mm:ss"; public static final String yyyy_MM_dd_HH_mm_ss_SSS = "yyyy-MM-dd HH:mm:ss.SSS"; public static final String yyyy_MM_dd = "yyyy-MM-dd"; public static final String dd_MM_yyyy = "dd/MM/yyyy"; public static final String HH_mm_ss = "HH:mm:ss"; public static String format(long millis, @NonNull String pattern) { Preconditions.checkTrue(millis >= 0); return format(new Date(millis), pattern); } public static String format(@NonNull Date date, @NonNull String pattern) { Preconditions.checkNotEmpty(pattern, "pattern is empty"); Preconditions.checkNotNull(date); return GlobalThreadLocalMap.getSimpleDateFormat(pattern).format(date); } public static SimpleDateFormat getSimpleDateFormat(@NonNull String pattern) { return GlobalThreadLocalMap.getSimpleDateFormat(pattern); } public static SimpleDateFormat getSimpleDateFormat(@NonNull String pattern, @Nullable Locale locale) { return GlobalThreadLocalMap.getSimpleDateFormat(pattern, locale); } public static SimpleDateFormat getSimpleDateFormat(@NonNull String pattern, @Nullable TimeZone timeZone) { return GlobalThreadLocalMap.getSimpleDateFormat(pattern, timeZone); } public static SimpleDateFormat getSimpleDateFormat(@NonNull String pattern, @Nullable String timeZoneId) { return GlobalThreadLocalMap.getSimpleDateFormat(pattern, timeZoneId); } public static SimpleDateFormat getSimpleDateFormat(@NonNull String pattern, @Nullable TimeZone timeZone, @Nullable Locale locale) { return GlobalThreadLocalMap.getSimpleDateFormat(pattern, timeZone, locale); } public static SimpleDateFormat getSimpleDateFormat(@NonNull String pattern, @Nullable String timeZoneId, @Nullable Locale locale) { return GlobalThreadLocalMap.getSimpleDateFormat(pattern, timeZoneId, locale); } public static Date parse(String dateString, String pattern) { try { return GlobalThreadLocalMap.getSimpleDateFormat(pattern).parse(dateString); } catch (ParseException ex) { throw Throwables.wrapAsRuntimeException(ex); } } /** * Adds a number of years to a date returning a new object. * The original {@code Date} is unchanged. * * @param date the date, not null * @param amount the amount to add, may be negative * @return the new {@code Date} with the amount added * @throws IllegalArgumentException if the date is null */ public static Date addYears(final Date date, final int amount) { return add(date, Calendars.YEAR, amount); } //----------------------------------------------------------------------- /** * Adds a number of months to a date returning a new object. * The original {@code Date} is unchanged. * * @param date the date, not null * @param amount the amount to add, may be negative * @return the new {@code Date} with the amount added * @throws IllegalArgumentException if the date is null */ public static Date addMonths(final Date date, final int amount) { return add(date, Calendars.MONTH, amount); } //----------------------------------------------------------------------- /** * Adds a number of weeks to a date returning a new object. * The original {@code Date} is unchanged. * * @param date the date, not null * @param amount the amount to add, may be negative * @return the new {@code Date} with the amount added * @throws IllegalArgumentException if the date is null */ public static Date addWeeks(final Date date, final int amount) { return add(date, Calendar.WEEK_OF_YEAR, amount); } //----------------------------------------------------------------------- /** * Adds a number of days to a date returning a new object. * The original {@code Date} is unchanged. * * @param date the date, not null * @param amount the amount to add, may be negative * @return the new {@code Date} with the amount added * @throws IllegalArgumentException if the date is null */ public static Date addDays(final Date date, final int amount) { return add(date, Calendars.DAY, amount); } //----------------------------------------------------------------------- /** * Adds a number of hours to a date returning a new object. * The original {@code Date} is unchanged. * * @param date the date, not null * @param amount the amount to add, may be negative * @return the new {@code Date} with the amount added * @throws IllegalArgumentException if the date is null */ public static Date addHours(final Date date, final int amount) { return add(date, Calendars.HOUR, amount); } //----------------------------------------------------------------------- /** * Adds a number of minutes to a date returning a new object. * The original {@code Date} is unchanged. * * @param date the date, not null * @param amount the amount to add, may be negative * @return the new {@code Date} with the amount added * @throws IllegalArgumentException if the date is null */ public static Date addMinutes(final Date date, final int amount) { return add(date, Calendars.MINUTE, amount); } //----------------------------------------------------------------------- /** * Adds a number of seconds to a date returning a new object. * The original {@code Date} is unchanged. * * @param date the date, not null * @param amount the amount to add, may be negative * @return the new {@code Date} with the amount added * @throws IllegalArgumentException if the date is null */ public static Date addSeconds(final Date date, final int amount) { return add(date, Calendars.SECOND, amount); } //----------------------------------------------------------------------- /** * Adds a number of milliseconds to a date returning a new object. * The original {@code Date} is unchanged. * * @param date the date, not null * @param amount the amount to add, may be negative * @return the new {@code Date} with the amount added * @throws IllegalArgumentException if the date is null */ public static Date addMilliseconds(final Date date, final int amount) { return add(date, Calendars.MILLIS, amount); } //----------------------------------------------------------------------- /** * Adds to a date returning a new object. * The original {@code Date} is unchanged. * * @param date the date, not null * @param calendarField the calendar field to add to * @param amount the amount to add, may be negative * @return the new {@code Date} with the amount added * @throws IllegalArgumentException if the date is null */ public static Date add(final Date date, final int calendarField, final int amount) { Preconditions.checkNotNull(date); final Calendar c = Calendar.getInstance(); c.setTime(date); c.add(calendarField, amount); return c.getTime(); } public static Date add(final Date date, final Calendars.DateField calendarField, final int amount) { Preconditions.checkNotNull(date); final Calendar c = Calendar.getInstance(); c.setTime(date); Calendars.addField(c, calendarField, amount); return c.getTime(); } //----------------------------------------------------------------------- /** * Sets the years field to a date returning a new object. * The original {@code Date} is unchanged. * * @param date the date, not null * @param amount the amount to set * @return a new {@code Date} set with the specified value * @throws IllegalArgumentException if the date is null */ public static Date setYears(final Date date, final int amount) { return set(date, Calendars.YEAR, amount); } //----------------------------------------------------------------------- /** * Sets the months field to a date returning a new object. * The original {@code Date} is unchanged. * * @param date the date, not null * @param amount the amount to set * @return a new {@code Date} set with the specified value * @throws IllegalArgumentException if the date is null */ public static Date setMonths(final Date date, final int amount) { return setMonths(date, amount, false); } public static Date setMonths(final Date date, final int amount, boolean valueIsActual) { return set(date, Calendars.MONTH, valueIsActual ? (amount - 1) : amount); } //----------------------------------------------------------------------- /** * Sets the day of month field to a date returning a new object. * The original {@code Date} is unchanged. * * @param date the date, not null * @param amount the amount to set * @return a new {@code Date} set with the specified value * @throws IllegalArgumentException if the date is null */ public static Date setDays(final Date date, final int amount) { return set(date, Calendars.DAY, amount); } //----------------------------------------------------------------------- /** * Sets the hours field to a date returning a new object. Hours range * from 0-23. * The original {@code Date} is unchanged. * * @param date the date, not null * @param amount the amount to set * @return a new {@code Date} set with the specified value * @throws IllegalArgumentException if the date is null */ public static Date setHours(final Date date, final int amount) { return set(date, Calendars.HOUR, amount); } //----------------------------------------------------------------------- /** * Sets the minute field to a date returning a new object. * The original {@code Date} is unchanged. * * @param date the date, not null * @param amount the amount to set * @return a new {@code Date} set with the specified value * @throws IllegalArgumentException if the date is null */ public static Date setMinutes(final Date date, final int amount) { return set(date, Calendars.MINUTE, amount); } //----------------------------------------------------------------------- /** * Sets the seconds field to a date returning a new object. * The original {@code Date} is unchanged. * * @param date the date, not null * @param amount the amount to set * @return a new {@code Date} set with the specified value * @throws IllegalArgumentException if the date is null */ public static Date setSeconds(final Date date, final int amount) { return set(date, Calendars.SECOND, amount); } //----------------------------------------------------------------------- /** * Sets the milliseconds field to a date returning a new object. * The original {@code Date} is unchanged. * * @param date the date, not null * @param amount the amount to set * @return a new {@code Date} set with the specified value * @throws IllegalArgumentException if the date is null */ public static Date setMilliseconds(final Date date, final int amount) { return set(date, Calendars.DateField.MILLIS, amount); } //----------------------------------------------------------------------- /** * Sets the specified field to a date returning a new object. * This does not use a lenient calendar. * The original {@code Date} is unchanged. * * @param date the date, not null * @param field the {@code Calendars.DateField} field to set the amount to * @param amount the amount to set * @return a new {@code Date} set with the specified value * @throws IllegalArgumentException if the date is null */ public static Date set(final Date date, final Calendars.DateField field, final int amount) { Preconditions.checkNotNull(date); // getInstance() returns a new object, so this method is thread safe. final Calendar c = Calendar.getInstance(); c.setLenient(false); c.setTime(date); Calendars.setField(c, field, amount); return c.getTime(); } public static int get(@NonNull Date date, final Calendars.DateField field) { return Calendars.getField(toCalendar(date), field); } public static int getYears(@NonNull Date date) { return Calendars.getYears(toCalendar(date)); } public static int getMonths(@NonNull Date date) { return getMonths(date, false); } public static int getMonths(@NonNull Date date, boolean getActualMonth) { return Calendars.getMonths(toCalendar(date), getActualMonth); } public static int getDays(@NonNull Date date) { return Calendars.getDays(toCalendar(date)); } public static int getHours(@NonNull Date date) { return Calendars.getHours(toCalendar(date)); } public static int getMinutes(@NonNull Date date) { return Calendars.getMinutes(toCalendar(date)); } public static int getSeconds(@NonNull Date date) { return Calendars.getSeconds(toCalendar(date)); } public static int getMillis(@NonNull Date date) { return Calendars.getMillis(toCalendar(date)); } public static long nextTime(long baselineInMills, long durationInMills) { Preconditions.checkTrue(baselineInMills >= 0); Preconditions.checkTrue(durationInMills >= 0); if (Long.MAX_VALUE - baselineInMills <= durationInMills) { return Long.MAX_VALUE; } return baselineInMills + durationInMills; } public static long nextTime(long durationInMills) { return nextTime(System.currentTimeMillis(), durationInMills); } public static long nowMills(){ return System.currentTimeMillis(); } public static Date now(){ return new Date(); } public static String nowReadableString(){ return format(new Date(), yyyy_MM_dd_HH_mm_ss); } //----------------------------------------------------------------------- /** * Converts a {@code Date} into a {@code Calendar}. * * @param date the date to convert to a Calendar * @return the created Calendar * @throws NullPointerException if null is passed in */ public static Calendar toCalendar(final Date date) { final Calendar c = Calendar.getInstance(); c.setLenient(false); c.setTime(date); return c; } //----------------------------------------------------------------------- /** * Converts a {@code Date} of a given {@code TimeZone} into a {@code Calendar} * * @param date the date to convert to a Calendar * @param tz the time zone of the {@code date} * @return the created Calendar * @throws NullPointerException if {@code date} or {@code tz} is null */ public static Calendar toCalendar(final Date date, final TimeZone tz) { final Calendar c = Calendar.getInstance(tz); c.setTime(date); return c; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy