package com.yami.trading.common.util;
|
|
import cn.hutool.core.lang.Tuple;
|
import com.yami.trading.common.util.DateUtil;
|
import org.springframework.util.Assert;
|
|
import java.text.DateFormat;
|
import java.text.ParseException;
|
import java.text.SimpleDateFormat;
|
import java.time.*;
|
import java.util.Calendar;
|
import java.util.Date;
|
import java.util.TimeZone;
|
|
public class UTCDateUtils {
|
|
public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
|
|
// 协调世界时
|
public static final String GMT_TIME_ZONE = "GMT";
|
|
public static final String NORMAL_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
|
// 判断是否休市用 东三区
|
public static final String GMT3 = "GMT+3:00";
|
|
public static long calcTimeBetweenInMinute(Date startDate, Date endDate) {
|
return calcTimeBetween("m", startDate, endDate);
|
}
|
|
public static boolean isOpen() {
|
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(GMT3));
|
long currentTime = calendar.getTime().getTime();
|
if (currentTime < UTCDateUtils.getClosedTime() && currentTime >= UTCDateUtils.getOpenTime()) {
|
return true;
|
} else {
|
return false;
|
}
|
}
|
public static boolean isOpen(int minutes) {
|
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(GMT3));
|
long currentTime = calendar.getTime().getTime();
|
int milliseconds = 1000 * 60 * minutes;
|
if (currentTime - milliseconds < UTCDateUtils.getClosedTime() && currentTime + milliseconds >= UTCDateUtils.getOpenTime()) {
|
return true;
|
} else {
|
return false;
|
}
|
}
|
|
public static void main(String[] args) {
|
boolean open = isOpen(30);
|
}
|
|
|
public static long getOpenTime() {
|
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(GMT3));
|
calendar.setFirstDayOfWeek(Calendar.SUNDAY);
|
calendar.set(Calendar.HOUR_OF_DAY, 00);
|
calendar.set(Calendar.MINUTE, 00);
|
calendar.set(Calendar.SECOND, 00);
|
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
|
return calendar.getTime().getTime();
|
}
|
|
public static long getClosedTime() {
|
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(GMT3));
|
calendar.setFirstDayOfWeek(Calendar.SUNDAY);
|
calendar.set(Calendar.HOUR_OF_DAY, 24);
|
calendar.set(Calendar.MINUTE, 00);
|
calendar.set(Calendar.SECOND, 00);
|
calendar.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
|
return calendar.getTime().getTime();
|
}
|
|
/**
|
* 获取当前时间所在的周的第一天(周一为第一天)
|
*/
|
public static String getFirstDateOfWeek(Date date) {
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(date);
|
int index = calendar.get(Calendar.DAY_OF_WEEK);
|
index = (index == 1) ? (index + 7) : index;
|
date = DateUtil.dateBeforeNDate(date, index - 2, "yyyy-MM-dd");
|
SimpleDateFormat f = new SimpleDateFormat(DEFAULT_DATE_FORMAT);
|
return f.format(date);
|
}
|
|
public static String addYear(Date date, int addYears) {
|
Calendar calendar = (Calendar) Calendar.getInstance().clone();
|
calendar.setTime(date);
|
calendar.add(Calendar.YEAR, addYears);
|
SimpleDateFormat f = new SimpleDateFormat(DEFAULT_DATE_FORMAT);
|
f.setTimeZone(TimeZone.getTimeZone(GMT_TIME_ZONE));
|
return f.format(calendar.getTime());
|
}
|
|
public static String addMonth(Date oldDate, int addMonths) {
|
Calendar calendar = (Calendar) Calendar.getInstance().clone();
|
calendar.setTime(oldDate);
|
calendar.add(Calendar.MONTH, addMonths);
|
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd-HH:mm");
|
f.setTimeZone(TimeZone.getTimeZone(GMT_TIME_ZONE));
|
return f.format(calendar.getTime());
|
}
|
|
public static String addDay(Date oldDate, int addDays) {
|
Calendar calendar = (Calendar) Calendar.getInstance().clone();
|
calendar.setTime(oldDate);
|
calendar.add(Calendar.DATE, addDays);
|
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd-HH:mm");
|
f.setTimeZone(TimeZone.getTimeZone(GMT_TIME_ZONE));
|
return f.format(calendar.getTime());
|
}
|
|
public static String addHour(Date oldDate, int addHours) {
|
Calendar calendar = (Calendar) Calendar.getInstance().clone();
|
calendar.setTime(oldDate);
|
calendar.add(Calendar.HOUR, addHours);
|
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd-HH:mm");
|
f.setTimeZone(TimeZone.getTimeZone(GMT_TIME_ZONE));
|
return f.format(calendar.getTime());
|
}
|
|
public static String addMinute(Date oldDate, int addMinutes) {
|
Calendar calendar = (Calendar) Calendar.getInstance().clone();
|
calendar.setTime(oldDate);
|
calendar.add(Calendar.MINUTE, addMinutes);
|
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd-HH:mm");
|
f.setTimeZone(TimeZone.getTimeZone(GMT_TIME_ZONE));
|
return f.format(calendar.getTime());
|
}
|
|
public static Date toDate(String s) {
|
return toDate(s, DEFAULT_DATE_FORMAT);
|
}
|
|
// 时区问题 CASTER TODO
|
public static Date toDate(String string, String pattern) {
|
return toDate(string, pattern, TimeZone.getTimeZone(GMT_TIME_ZONE));
|
}
|
|
public static Date toDate(String string, String pattern, TimeZone timeZone) {
|
try {
|
SimpleDateFormat sdf = (SimpleDateFormat) createDateFormat(pattern, timeZone);
|
return sdf.parse(string);
|
} catch (ParseException e) {
|
throw new RuntimeException(e);
|
}
|
}
|
|
public static DateFormat createDateFormat(String pattern, TimeZone timeZone) {
|
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
|
TimeZone gmt = timeZone;
|
sdf.setTimeZone(gmt);
|
sdf.setLenient(true);
|
return sdf;
|
}
|
|
public static long calcTimeBetween(String unitType, Date startDate, Date endDate) {
|
Assert.hasText(unitType);
|
Assert.notNull(startDate);
|
Assert.notNull(endDate);
|
long between = endDate.getTime() - startDate.getTime();
|
if (unitType.equals("ms")) {
|
return between;
|
} else if (unitType.equals("s")) {
|
return between / 1000;// 返回秒
|
} else if (unitType.equals("m")) {
|
return between / 60000;// 返回分钟
|
} else if (unitType.equals("h")) {
|
return between / 3600000;// 返回小时
|
} else if (unitType.equals("d")) {
|
return between / 86400000;// 返回天数
|
} else {
|
throw new IllegalArgumentException("the unitType is unknown");
|
}
|
}
|
|
|
public static Tuple getStartAndEnd(Integer period) {
|
LocalDateTime startDate = null;
|
LocalDateTime endDate = LocalDateTime.now();
|
switch (period) {
|
case 1:
|
startDate = endDate.with(LocalTime.MIN);
|
break;
|
case 2:
|
endDate = endDate.with(LocalTime.MIN).minusSeconds(1);
|
startDate = endDate.with(LocalTime.MIN);
|
break;
|
case 3:
|
startDate = endDate.minusDays(6).with(LocalTime.MIN);
|
break;
|
case 4:
|
startDate = endDate.minusDays(14).with(LocalTime.MIN);
|
break;
|
case 5:
|
startDate = endDate.minusDays(29).with(LocalTime.MIN);
|
break;
|
default:
|
System.out.println("Invalid period input");
|
}
|
long startTimestamp = startDate.toInstant(ZoneOffset.of("+8")).toEpochMilli();
|
long endTimestamp = endDate.toInstant(ZoneOffset.of("+8")).toEpochMilli();
|
return new Tuple(startTimestamp, endTimestamp);
|
}
|
|
public static Date toDate(LocalDateTime dateTime) {
|
//将LocalDateTime对象转换为Date对象
|
// LocalDateTime dateTime = LocalDateTime.now();
|
ZonedDateTime zonedDateTime = dateTime.atZone(ZoneId.systemDefault());
|
Instant instant2 = zonedDateTime.toInstant();
|
Date date2 = Date.from(instant2);
|
return date2;
|
}
|
|
public static LocalDateTime toLocalDateTime(Date date) {
|
//将Date对象转换为LocalDateTime
|
// Date date = new Date();
|
Instant instant = date.toInstant();
|
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
|
return localDateTime;
|
}
|
|
public static boolean isTimestampFromToday(long timestamp, ZoneId zoneId) {
|
Instant instant = Instant.ofEpochSecond(timestamp);
|
LocalDate timestampDate = instant.atZone(zoneId).toLocalDate();
|
LocalDate today = LocalDate.now();
|
|
return timestampDate.isEqual(today);
|
}
|
|
}
|