Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,9 @@
package org.apache.hadoop.yarn.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -31,23 +32,16 @@ public class Times {
private static final Logger LOG =
LoggerFactory.getLogger(Times.class);

static final String ISO8601DATEFORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
static final String ISO8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";

// This format should match the one used in yarn.dt.plugins.js
static final ThreadLocal<SimpleDateFormat> dateFormat =
new ThreadLocal<SimpleDateFormat>() {
@Override protected SimpleDateFormat initialValue() {
return new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy");
}
};
static final DateTimeFormatter DATE_FORMAT =
DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss Z yyyy").withZone(
ZoneId.systemDefault());

static final ThreadLocal<SimpleDateFormat> isoFormat =
new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat(ISO8601DATEFORMAT);
}
};
static final DateTimeFormatter ISO_OFFSET_DATE_TIME =
DateTimeFormatter.ofPattern(ISO8601_DATE_FORMAT).withZone(
ZoneId.systemDefault());

public static long elapsed(long started, long finished) {
return Times.elapsed(started, finished, true);
Expand Down Expand Up @@ -83,8 +77,7 @@ public static long elapsed(long started, long finished, boolean isRunning) {
}

public static String format(long ts) {
return ts > 0 ? String.valueOf(dateFormat.get().format(new Date(ts)))
: "N/A";
return ts > 0 ? DATE_FORMAT.format(Instant.ofEpochMilli(ts)) : "N/A";
}

/**
Expand All @@ -94,7 +87,7 @@ public static String format(long ts) {
* @return ISO 8601 formatted string.
*/
public static String formatISO8601(long ts) {
return isoFormat.get().format(new Date(ts));
return ISO_OFFSET_DATE_TIME.format(Instant.ofEpochMilli(ts));
}

/**
Expand All @@ -109,6 +102,6 @@ public static long parseISO8601ToLocalTimeInMillis(String isoString)
if (isoString == null) {
throw new ParseException("Invalid input.", -1);
}
return isoFormat.get().parse(isoString).getTime();
return Instant.from(ISO_OFFSET_DATE_TIME.parse(isoString)).toEpochMilli();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@
import org.junit.Assert;
import org.junit.Test;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import static org.apache.hadoop.yarn.util.Times.ISO8601_DATE_FORMAT;

public class TestTimes {

@Test
Expand Down Expand Up @@ -61,4 +67,15 @@ public void testFinishTimesAheadOfStartTimes() {
elapsed = Times.elapsed(Long.MAX_VALUE, 0, true);
Assert.assertEquals("Elapsed time is not -1", -1, elapsed);
}

@Test
public void validateISO() throws IOException {
SimpleDateFormat isoFormat = new SimpleDateFormat(ISO8601_DATE_FORMAT);
for (int i = 0; i < 1000; i++) {
long now = System.currentTimeMillis();
String instant = Times.formatISO8601(now);
String date = isoFormat.format(new Date(now));
Assert.assertEquals(date, instant);
}
}
}