package com.leontg77.uhc.utils;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Date utilities class.
* <p>
* Contains time and date related methods.
*
* @author Essentials
*/
public class DateUtils {
private static Pattern timePattern = Pattern.compile("(?:([0-9]+)\\s*y[a-z]*[,\\s]*)?" + "(?:([0-9]+)\\s*mo[a-z]*[,\\s]*)?" + "(?:([0-9]+)\\s*w[a-z]*[,\\s]*)?" + "(?:([0-9]+)\\s*d[a-z]*[,\\s]*)?" + "(?:([0-9]+)\\s*h[a-z]*[,\\s]*)?" + "(?:([0-9]+)\\s*m[a-z]*[,\\s]*)?" + "(?:([0-9]+)\\s*(?:s[a-z]*)?)?", Pattern.CASE_INSENSITIVE);
private static final long SECONDS_PER_HOUR = 3600;
private static final long SECONDS_PER_MINUTE = 60;
/**
* Idk how to explain it, essentials made it, ask them xD
*/
public static String removeTimePattern(String input) {
return timePattern.matcher(input).replaceFirst("").trim();
}
/**
* Converts the seconds to hours, minutes and seconds.
*
* @author ghowden, modified by LeonTG77
*
* @param ticks the number of seconds
* @return The converted version.
*/
public static String ticksToString(long ticks) {
int hours = (int) Math.floor(ticks / (double) SECONDS_PER_HOUR);
ticks -= hours * SECONDS_PER_HOUR;
int minutes = (int) Math.floor(ticks / (double)SECONDS_PER_MINUTE);
ticks -= minutes * SECONDS_PER_MINUTE;
int seconds = (int) ticks;
StringBuilder output = new StringBuilder();
if (hours > 0) {
output.append(hours).append('h');
if (minutes == 0) {
output.append(minutes).append('m');
}
}
if (minutes > 0) {
output.append(minutes).append('m');
}
output.append(seconds).append('s');
return output.toString();
}
/**
* Converts the seconds to advanced hours, minutes and seconds.
*
* @author ghowden, modified by LeonTG77
*
* @param ticks the number of seconds
* @return The converted version.
*/
public static String advancedTicksToString(long ticks) {
int hours = (int) Math.floor(ticks / (double) SECONDS_PER_HOUR);
ticks -= hours * SECONDS_PER_HOUR;
int minutes = (int) Math.floor(ticks / (double) SECONDS_PER_MINUTE);
ticks -= minutes * SECONDS_PER_MINUTE;
int seconds = (int) ticks;
StringBuilder output = new StringBuilder();
if (hours > 0) {
output.append(hours).append(" ").append(hours == 1 ? "�7hour�a" : "�7hours�a");
}
if (minutes > 0) {
if (output.length() > 0) {
output.append(" �7and�a ");
}
output.append(minutes).append(" ").append(minutes == 1 ? "�7minute�a" : "�7minutes�a");
}
if (seconds > 0) {
if (output.length() > 0) {
output.append("�7 and�a ");
}
output.append(seconds).append(" ").append(seconds == 1 ? "�7second�a" : "�7seconds�a");
}
return output.toString();
}
/**
* Idk, essentials made this...
*/
public static long parseDateDiff(String time, boolean future) {
Matcher m = timePattern.matcher(time);
int years = 0;
int months = 0;
int weeks = 0;
int days = 0;
int hours = 0;
int minutes = 0;
int seconds = 0;
boolean found = false;
while (m.find()) {
if (m.group() == null || m.group().isEmpty()) {
continue;
}
for (int i = 0; i < m.groupCount(); i++) {
if (m.group(i) != null && !m.group(i).isEmpty()) {
found = true;
break;
}
}
if (found) {
if (m.group(1) != null && !m.group(1).isEmpty()) {
years = Integer.parseInt(m.group(1));
}
if (m.group(2) != null && !m.group(2).isEmpty()) {
months = Integer.parseInt(m.group(2));
}
if (m.group(3) != null && !m.group(3).isEmpty()) {
weeks = Integer.parseInt(m.group(3));
}
if (m.group(4) != null && !m.group(4).isEmpty()) {
days = Integer.parseInt(m.group(4));
}
if (m.group(5) != null && !m.group(5).isEmpty()) {
hours = Integer.parseInt(m.group(5));
}
if (m.group(6) != null && !m.group(6).isEmpty()) {
minutes = Integer.parseInt(m.group(6));
}
if (m.group(7) != null && !m.group(7).isEmpty()) {
seconds = Integer.parseInt(m.group(7));
}
break;
}
}
if (!found) {
return 0;
}
Calendar c = new GregorianCalendar();
if (years > 0) {
c.add(Calendar.YEAR, years * (future ? 1 : -1));
}
if (months > 0) {
c.add(Calendar.MONTH, months * (future ? 1 : -1));
}
if (weeks > 0) {
c.add(Calendar.WEEK_OF_YEAR, weeks * (future ? 1 : -1));
}
if (days > 0) {
c.add(Calendar.DAY_OF_MONTH, days * (future ? 1 : -1));
}
if (hours > 0) {
c.add(Calendar.HOUR_OF_DAY, hours * (future ? 1 : -1));
}
if (minutes > 0) {
c.add(Calendar.MINUTE, minutes * (future ? 1 : -1));
}
if (seconds > 0) {
c.add(Calendar.SECOND, seconds * (future ? 1 : -1));
}
Calendar max = new GregorianCalendar();
max.add(Calendar.YEAR, 10);
if (c.after(max)) {
return max.getTimeInMillis();
}
return c.getTimeInMillis();
}
/**
* Idk how to explain it, essentials made it, ask them xD
*/
static int dateDiff(int type, Calendar fromDate, Calendar toDate, boolean future) {
int diff = 0;
long savedDate = fromDate.getTimeInMillis();
while ((future && !fromDate.after(toDate)) || (!future && !fromDate.before(toDate))) {
savedDate = fromDate.getTimeInMillis();
fromDate.add(type, future ? 1 : -1);
diff++;
}
diff--;
fromDate.setTimeInMillis(savedDate);
return diff;
}
/**
* Idk how to explain it, essentials made it, ask them xD
*/
public static String formatDateDiff(long date) {
Calendar c = new GregorianCalendar();
c.setTimeInMillis(date);
Calendar now = new GregorianCalendar();
return DateUtils.formatDateDiff(now, c);
}
/**
* Idk how to explain it, essentials made it, ask them xD
*/
public static String formatDateDiff(Calendar fromDate, Calendar toDate) {
boolean future = false;
if (toDate.equals(fromDate)) {
return "now";
}
if (toDate.after(fromDate)) {
future = true;
}
StringBuilder sb = new StringBuilder();
int[] types = new int[] {
Calendar.YEAR, Calendar.MONTH, Calendar.DAY_OF_MONTH, Calendar.HOUR_OF_DAY, Calendar.MINUTE, Calendar.SECOND
};
String[] names = new String[] {
"year", "years", "month", "months", "day", "days", "hour", "hours", "minute", "minutes", "second", "seconds"
};
int accuracy = 0;
for (int i = 0; i < types.length; i++) {
if (accuracy > 2) {
break;
}
int diff = dateDiff(types[i], fromDate, toDate, future);
if (diff > 0) {
accuracy++;
sb.append(" ").append(diff).append(" ").append(names[i * 2 + (diff > 1 ? 1 : 0)]);
}
}
if (sb.length() == 0) {
return "now";
}
return sb.toString().trim();
}
}