com.ddfplus.util.DDFDate Maven / Gradle / Ivy
/**
* Copyright (C) 2004 - 2015 by Barchart.com, Inc. All Rights Reserved.
*
* This software is the proprietary information of Barchart.com, Inc.
* Use is subject to license terms.
*/
package com.ddfplus.util;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
/**
* The DDFDate class encapsulates a date and provides some utility functions,
* such as conversions to/from ddfplus day codes.
*/
public class DDFDate {
public static final ZoneId _zoneChicago = ZoneId.of("America/Chicago");
private static final DateTimeFormatter _formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(_zoneChicago);
private final ZonedDateTime _zdt;
private final char _dayCode;
public DDFDate(ZonedDateTime zdt) {
_zdt = zdt;
_dayCode = DDFDate.convertNumberToDayCode(_zdt.getDayOfMonth());
}
/**
* @param millis
* The time in milliseconds as a long
.
*/
// XXX TIME!ZONE : assume millis are UTC
public DDFDate(long millis) {
_zdt = ZonedDateTime.ofInstant(Instant.ofEpochMilli(millis), _zoneChicago);
_dayCode = DDFDate.convertNumberToDayCode(_zdt.getDayOfMonth());
}
/** *
* @return The ZonedDateTime
representing the date.
*/
public ZonedDateTime getDate() {
return _zdt;
}
/**
* Returns the ddfplus day code for this object.
*
* @return The ddfplus day code.
*/
public char getDayCode() {
return this._dayCode;
}
/**
* Returns the milliseconds associated with this date.
*
* @return The date value in milliseconds.
*/
public long getMillisCST() {
return _zdt.withZoneSameInstant(_zoneChicago).toInstant().toEpochMilli();
}
/**
* Returns a String in the format YYYYMMDDHHNNSS
*/
public String toDDFString() {
return _zdt.format(_formatter);
}
@Override
public String toString() {
return Long.toString(_zdt.toInstant().toEpochMilli());
}
/**
* Converts a ddfplus char
day code into a numeric value.
* ddfplus day codes are characters '1' .. '9', '0', 'A' .. 'U' representing
* the numbers 1 .. 31, in order.
*
* @param daycode
* A char
value '1' .. '9', '0', 'A' .. 'U'
* @return The int
corresponding value.
*/
public static int convertDayCodeToNumber(char daycode) {
if (daycode == '\0')
return 0;
if ((daycode >= '1') && (daycode <= '9'))
return (daycode - '0');
else if (daycode == '0')
return 10;
else
return ((daycode - 'A') + 11);
}
/**
* Converts a numeric day value to a ddfplus char
day code.
*
* @param value
* A calendar value, e.g. 1 .. 31
* @return char
The day code, e.g. 1 .. 9, 0, A .. U
*/
public static char convertNumberToDayCode(int value) {
if ((value >= 1) && (value <= 9))
return (char) ('1' + value - 1);
else if (value == 10)
return '0';
else
return (char) ('A' + value - 11);
}
/**
* Creates a new DDFDate
object with the current time as the
* reference point.
*
* @param daycode
* The char
ddfplus day code.
* @return The DDFDate
object
*/
public static DDFDate fromDayCode(final char daycode) {
int day = DDFDate.convertDayCodeToNumber(daycode);
if ((day < 1) || (day > 31))
return null;
ZonedDateTime zdt = ZonedDateTime.now(_zoneChicago);
boolean plusMonth = (day < zdt.getDayOfMonth() - 25);
boolean minusMonth = (day > zdt.getDayOfMonth() + 5);
if (plusMonth)
zdt = zdt.plusMonths(1);
else if (minusMonth)
zdt = zdt.minusMonths(1);
zdt = zdt.withDayOfMonth(day);
return new DDFDate(zdt);
}
/**
* Parses a date in the format YYYYMMDDHHNNSS
*
* @return DDFDate
The DDFDate object
*/
public static DDFDate fromDDFString(String s) {
try {
ZonedDateTime zdt = ZonedDateTime.parse(s, _formatter);
return new DDFDate(zdt);
} catch (Exception e) {
;
}
return null;
}
}