package com.ripple.core.coretypes;
import com.ripple.core.coretypes.uint.UInt32;
import com.ripple.core.serialized.BinaryParser;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;
//public class RippleDate extends Date implements SerializedType {
public class RippleDate extends Date {
public static long RIPPLE_EPOCH_SECONDS_OFFSET = 0x386D4380;
static {
/**
* Magic constant tested and documented.
*
* Seconds since the unix epoch from unix time (accounting leap years etc)
* at 1/January/2000 GMT
*/
GregorianCalendar cal = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
cal.set(2000, Calendar.JANUARY, 1, 0, 0, 0);
long computed = cal.getTimeInMillis() / 1000;
assertEquals("1 Jan 2000 00:00:00 GMT", cal.getTime().toGMTString()); // TODO
assertEquals(RippleDate.RIPPLE_EPOCH_SECONDS_OFFSET, computed);
}
private static void assertEquals(String s, String s1) {
if (!s.equals(s1)) throw new AssertionError(String.format("%s != %s", s, s1));
}
private static void assertEquals(long a, long b) {
if (a != b) throw new AssertionError(String.format("%s != %s", a, b));
}
private RippleDate() {
super();
}
private RippleDate(long milliseconds) {
super(milliseconds);
}
public long secondsSinceRippleEpoch() {
return ((this.getTime() / 1000) - RIPPLE_EPOCH_SECONDS_OFFSET);
}
public static RippleDate fromSecondsSinceRippleEpoch(Number seconds) {
return new RippleDate((seconds.longValue() + RIPPLE_EPOCH_SECONDS_OFFSET) * 1000);
}
public static RippleDate fromParser(BinaryParser parser) {
UInt32 uInt32 = UInt32.translate.fromParser(parser);
return fromSecondsSinceRippleEpoch(uInt32);
}
public static RippleDate now() {
return new RippleDate();
}
private static final DateFormat YYYY_MM_DD_HHMM = new SimpleDateFormat(
"yyyy-MM-dd HH:mm");
public String getTimeString() {
return YYYY_MM_DD_HHMM.format(this);
}
/* @Override
public Object toJSON() {
return secondsSinceRippleEpoch();
}
@Override
public byte[] toBytes() {
return new UInt32(secondsSinceRippleEpoch()).toBytes();
}
@Override
public String toHex() {
return new UInt32(secondsSinceRippleEpoch()).toHex();
}
@Override
public void toBytesSink(BytesSink to) {
new UInt32(secondsSinceRippleEpoch()).toBytesSink(to);
}*/
}