package java.time;
import jsinterop.annotations.*;
import java.time.chrono.ChronoLocalDateTime;
import java.time.format.DateTimeFormatter;
@JsType
@SuppressWarnings("unusable-by-js")
public class LocalDateTime {
private LocalDate date;
private LocalTime time;
static final long NANOS_PER_SECOND = 1000_000_000L;
static final int HOURS_PER_DAY = 24;
static final int MINUTES_PER_HOUR = 60;
static final int SECONDS_PER_MINUTE = 60;
static final int SECONDS_PER_HOUR = SECONDS_PER_MINUTE * MINUTES_PER_HOUR;
static final int SECONDS_PER_DAY = SECONDS_PER_HOUR * HOURS_PER_DAY;
public static final LocalDateTime MIN = LocalDateTime.of(LocalDate.MIN, LocalTime.MIN);
private LocalDateTime(LocalDate date, LocalTime time) {
this.date = date;
this.time = time;
}
public static LocalDateTime of(LocalDate date, LocalTime time) {
return new LocalDateTime(date, time);
}
public LocalTime toLocalTime() {
return time;
}
public LocalDate toLocalDate() {
return date;
}
public long toEpochSecond(ZoneOffset offset) {
long epochDay = toLocalDate().toEpochDay();
long secs = epochDay * 86400 + toLocalTime().toSecondOfDay();
secs -= offset.getTotalSeconds();
return secs;
}
public static LocalDateTime ofEpochSecond(long epochSecond, int nanoOfSecond, ZoneOffset offset) {
long localSecond = epochSecond + offset.getTotalSeconds(); // overflow caught later
long localEpochDay = Math.floorDiv(localSecond, SECONDS_PER_DAY);
int secsOfDay = (int)Math.floorMod(localSecond, SECONDS_PER_DAY);
LocalDate date = LocalDate.ofEpochDay(localEpochDay);
LocalTime time = LocalTime.ofNanoOfDay(secsOfDay * NANOS_PER_SECOND + nanoOfSecond);
return new LocalDateTime(date, time);
}
@JsIgnore
public static LocalDateTime now(Clock clock) {
final Instant now = clock.instant(); // called once
ZoneOffset offset = clock.getZone().getRules().getOffset(now);
return ofEpochSecond(now.getEpochSecond(), now.getNano(), offset);
}
public static LocalDateTime now() {
return now(Clock.systemDefaultZone());
}
public LocalDateTime plusNanos(long nanos) {
return null;
}
public static LocalDateTime ofInstant(Instant instant, ZoneId zone) {
return null;
}
public Instant toInstant(ZoneOffset offset) {
return null;
}
public boolean isBefore(LocalDateTime other) {
return false;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof LocalDateTime) {
LocalDateTime other = (LocalDateTime) obj;
return date.equals(other.date) && time.equals(other.time);
}
return false;
}
@Override
public int hashCode() {
return date.hashCode() ^ time.hashCode();
}
@Override
public String toString() {
return date.toString() +"T"+ time.toString();
}
}