diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java index 463d44618e..cbfd7b48a5 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -7,13 +7,11 @@ import java.io.Serializable; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.text.DecimalFormat; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; -import java.util.Date; import java.util.Enumeration; import java.util.Iterator; import java.util.List; @@ -1803,11 +1801,8 @@ public class I2PSnarkServlet extends BasicServlet { out.write(formatSize(total-remaining) + thinsp(noThinsp) + formatSize(total)); out.write(""); } else if (remaining == 0) { - // needs locale configured for automatic translation - SimpleDateFormat fmt = new SimpleDateFormat("HH:mm, EEE dd MMM yyyy"); - fmt.setTimeZone(SystemVersion.getSystemTimeZone(_context)); long[] dates = _manager.getSavedAddedAndCompleted(snark); - String date = fmt.format(new Date(dates[1])); + String date = DataHelper.formatTime(dates[1]); out.write("
"); out.write(formatSize(total)); // 3GB @@ -3105,11 +3100,8 @@ public class I2PSnarkServlet extends BasicServlet { .append("\n"); } long dat = meta.getCreationDate(); - // needs locale configured for automatic translation - SimpleDateFormat fmt = new SimpleDateFormat("EEEE dd MMMM yyyy HH:mm"); - fmt.setTimeZone(SystemVersion.getSystemTimeZone(_context)); if (dat > 0) { - String date = fmt.format(new Date(dat)); + String date = DataHelper.formatTime(dat); buf.append(""); toThemeImg(buf, "details"); buf.append("") @@ -3130,7 +3122,7 @@ public class I2PSnarkServlet extends BasicServlet { } long[] dates = _manager.getSavedAddedAndCompleted(snark); if (dates[0] > 0) { - String date = fmt.format(new Date(dates[0])); + String date = DataHelper.formatTime(dates[0]); buf.append(""); toThemeImg(buf, "details"); buf.append("") @@ -3139,7 +3131,7 @@ public class I2PSnarkServlet extends BasicServlet { .append("\n"); } if (dates[1] > 0) { - String date = fmt.format(new Date(dates[1])); + String date = DataHelper.formatTime(dates[1]); buf.append(""); toThemeImg(buf, "details"); buf.append("") @@ -3150,7 +3142,7 @@ public class I2PSnarkServlet extends BasicServlet { if (storage != null) { dat = storage.getActivity(); if (dat > 0) { - String date = fmt.format(new Date(dat)); + String date = DataHelper.formatTime(dat); buf.append(""); toThemeImg(buf, "details"); buf.append("") @@ -3451,8 +3443,6 @@ public class I2PSnarkServlet extends BasicServlet { .append("\n"); - //DateFormat dfmt=DateFormat.getDateTimeInstance(DateFormat.MEDIUM, - // DateFormat.MEDIUM); boolean showSaveButton = false; boolean rowEven = true; boolean inOrder = storage != null && storage.getInOrder(); @@ -3553,7 +3543,6 @@ public class I2PSnarkServlet extends BasicServlet { if (!item.isDirectory()) buf.append(formatSize(length)); buf.append(""); - //buf.append(dfmt.format(new Date(item.lastModified()))); buf.append(status); buf.append(""); if (showPriority) { @@ -3740,8 +3729,6 @@ public class I2PSnarkServlet extends BasicServlet { // existing ratings / comments table int ccount = 0; if (iter != null) { - SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm"); - fmt.setTimeZone(SystemVersion.getSystemTimeZone(_context)); buf.append(""); while (iter.hasNext()) { @@ -3766,7 +3753,7 @@ public class I2PSnarkServlet extends BasicServlet { } } } - buf.append(""); - SimpleDateFormat fmt = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM); - // the router sets the JVM time zone to UTC but saves the original here so we can get it - fmt.setTimeZone(SystemVersion.getSystemTimeZone(_context)); - List> entries = new ArrayList>(events.entrySet()); Collections.reverse(entries); for (Map.Entry e : entries) { long time = e.getKey().longValue(); String event = e.getValue(); buf.append("
").append(fmt.format(new Date(c.getTime()))); + buf.append("").append(DataHelper.formatTime(c.getTime())); buf.append(""); if (esc) { if (c.getText() != null) { diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ConnThrottler.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ConnThrottler.java index 8c43b66a3e..d84922af77 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ConnThrottler.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ConnThrottler.java @@ -1,8 +1,6 @@ package net.i2p.i2ptunnel; -import java.text.DateFormat; import java.util.ArrayList; -import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -38,7 +36,6 @@ class ConnThrottler { private long _totalThrottleUntil; private final String _action; private final Log _log; - private final DateFormat _fmt; private final SimpleTimer2.TimedEvent _cleaner; private boolean _isRunning; @@ -58,9 +55,6 @@ class ConnThrottler { _peers = new HashMap(4); _action = action; _log = log; - // for logging - _fmt = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM); - _fmt.setTimeZone(SystemVersion.getSystemTimeZone()); _cleaner = new Cleaner(); } @@ -124,7 +118,7 @@ class ConnThrottler { long now = Clock.getInstance().now(); if (rec.countSince(now - _checkPeriod) > _max) { long until = now + _throttlePeriod; - String date = _fmt.format(new Date(until)); + String date = DataHelper.formatTime(until); _log.logAlways(Log.WARN, "Throttling " + _action + " until " + date + " after exceeding max of " + _max + " in " + DataHelper.formatDuration(_checkPeriod) + @@ -139,7 +133,7 @@ class ConnThrottler { if (_totalMax > 0 && ++_currentTotal > _totalMax) { if (_totalThrottleUntil == 0) { _totalThrottleUntil = Clock.getInstance().now() + _totalThrottlePeriod; - String date = _fmt.format(new Date(_totalThrottleUntil)); + String date = DataHelper.formatTime(_totalThrottleUntil); _log.logAlways(Log.WARN, "*** Throttling " + _action + " from ALL peers until " + date + " after exceeding max of " + _max + " in " + DataHelper.formatDuration(_checkPeriod)); diff --git a/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java b/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java index d7fb300897..005fc9bf40 100644 --- a/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java +++ b/apps/routerconsole/java/src/net/i2p/router/news/NewsManager.java @@ -248,17 +248,26 @@ public class NewsManager implements ClientApp { int colon = newsContent.indexOf(": "); if (colon > 0 && colon <= 10) { // Parse the format we wrote it out in, in NewsFetcher.outputOldNewsXML() - // Doesn't work if the date has a : in it, but SHORT hopefully does not - DateFormat fmt = DateFormat.getDateInstance(DateFormat.SHORT); + // Doesn't work if the date has a : in it, but SHORT and MEDIUM hopefully do not + // Was originally SHORT, switched to MEDIUM in 0.9.43 + DateFormat fmt = DateFormat.getDateInstance(DateFormat.MEDIUM); // the router sets the JVM time zone to UTC but saves the original here so we can get it fmt.setTimeZone(SystemVersion.getSystemTimeZone(_context)); try { Date date = fmt.parse(newsContent.substring(0, colon)); entry.updated = date.getTime(); - newsContent = newsContent.substring(colon + 2); } catch (ParseException pe) { - // can't find date, will be zero + // try SHORT + try { + fmt = DateFormat.getDateInstance(DateFormat.SHORT); + fmt.setTimeZone(SystemVersion.getSystemTimeZone(_context)); + Date date = fmt.parse(newsContent.substring(0, colon)); + entry.updated = date.getTime(); + } catch (ParseException pe2) { + // can't find date, will be zero + } } + newsContent = newsContent.substring(colon + 2); } } int end = newsContent.indexOf(""); diff --git a/apps/routerconsole/java/src/net/i2p/router/sybil/Analysis.java b/apps/routerconsole/java/src/net/i2p/router/sybil/Analysis.java index 59852a1134..81e3f17147 100644 --- a/apps/routerconsole/java/src/net/i2p/router/sybil/Analysis.java +++ b/apps/routerconsole/java/src/net/i2p/router/sybil/Analysis.java @@ -4,7 +4,6 @@ import java.io.IOException; import java.io.Serializable; import java.math.BigInteger; import java.text.DecimalFormat; -import java.text.DateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -391,9 +390,7 @@ public class Analysis extends JobImpl implements RouterApp { if (threshold < MIN_BLOCK_POINTS) threshold = MIN_BLOCK_POINTS; } catch (NumberFormatException nfe) {} - DateFormat dfmt = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT); - dfmt.setTimeZone(SystemVersion.getSystemTimeZone(_context)); - String day = dfmt.format(now); + String day = DataHelper.formatTime(now); for (Map.Entry e : points.entrySet()) { double p = e.getValue().getPoints(); if (p >= threshold) { diff --git a/apps/routerconsole/java/src/net/i2p/router/update/NewsFetcher.java b/apps/routerconsole/java/src/net/i2p/router/update/NewsFetcher.java index 80e774df7b..cb678e8d84 100644 --- a/apps/routerconsole/java/src/net/i2p/router/update/NewsFetcher.java +++ b/apps/routerconsole/java/src/net/i2p/router/update/NewsFetcher.java @@ -12,7 +12,6 @@ import java.io.Writer; import java.net.URI; import java.net.URISyntaxException; import java.security.GeneralSecurityException; -import java.text.DateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Date; @@ -635,8 +634,6 @@ class NewsFetcher extends UpdateRunner { } Blocklist bl = _context.blocklist(); Banlist ban = _context.banlist(); - DateFormat fmt = DateFormat.getDateInstance(DateFormat.SHORT); - fmt.setTimeZone(SystemVersion.getSystemTimeZone(_context)); String reason = "Blocklist feed " + new Date(ble.updated); int banned = 0; for (Iterator iter = ble.entries.iterator(); iter.hasNext(); ) { @@ -764,16 +761,13 @@ class NewsFetcher extends UpdateRunner { out.write("-->\n"); if (entries == null) return; - DateFormat fmt = DateFormat.getDateInstance(DateFormat.SHORT); - // the router sets the JVM time zone to UTC but saves the original here so we can get it - fmt.setTimeZone(SystemVersion.getSystemTimeZone(_context)); for (NewsEntry e : entries) { if (e.title == null || e.content == null) continue; - Date date = new Date(e.updated); - out.write("\n"); + out.write("\n"); out.write("

"); - out.write(fmt.format(date)); + // Warning - update NewsHandler.parseNews() if you change the format + out.write(DataHelper.formatDate(e.updated)); out.write(": "); out.write(e.title); out.write("

\n"); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java index e2109946d2..69dae13273 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java @@ -65,7 +65,7 @@ public class NewsFeedHelper extends HelperBase { } } if (!entries.isEmpty()) { - DateFormat fmt = DateFormat.getDateInstance(DateFormat.SHORT); + DateFormat fmt = DateFormat.getDateInstance(DateFormat.MEDIUM); // the router sets the JVM time zone to UTC but saves the original here so we can get it fmt.setTimeZone(SystemVersion.getSystemTimeZone(ctx)); int i = 0; diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java index 9c2d62f209..1a058a99cd 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java @@ -4,8 +4,6 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.Reader; -import java.text.SimpleDateFormat; -import java.util.Date; import net.i2p.data.DataHelper; import net.i2p.router.RouterContext; @@ -201,7 +199,7 @@ public class NewsHelper extends ContentHelper { /** * Convert long date stamp to - * '07-Jul 21:09 UTC' with month name in the system locale + * date/time in the system locale, local time zone * @return null if ver = null * @since 0.9.4 moved from NewsFetcher */ @@ -209,7 +207,7 @@ public class NewsHelper extends ContentHelper { if (ver != null) { try { long modtime = Long.parseLong(ver); - return (new SimpleDateFormat("dd-MMM HH:mm")).format(new Date(modtime)) + " UTC"; + return DataHelper.formatTime(modtime); } catch (NumberFormatException nfe) {} } return null; diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java index 9b0d472f53..e5647f0ae8 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java @@ -1,11 +1,9 @@ package net.i2p.router.web.helpers; import java.text.Collator; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import java.util.Date; import java.util.List; import java.util.Locale; import java.util.Properties; @@ -289,7 +287,7 @@ public class ConfigClientsHelper extends HelperBase { ms = Long.parseLong(s); } catch (NumberFormatException nfe) {} if (ms > 0) { - String date = (new SimpleDateFormat("yyyy-MM-dd HH:mm")).format(new Date(ms)); + String date = DataHelper.formatTime(ms); desc.append("
") .append(_t("Date")).append("").append(date); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/EventLogHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/EventLogHelper.java index 2f67328c24..0632f6cfd4 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/EventLogHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/EventLogHelper.java @@ -2,12 +2,9 @@ package net.i2p.router.web.helpers; import java.io.IOException; import java.text.Collator; -import java.text.DateFormat; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -187,17 +184,13 @@ public class EventLogHelper extends FormHandler { } buf.append("
"); - buf.append(fmt.format(new Date(time))); + buf.append(DataHelper.formatTime(time)); buf.append(""); if (isAll) { String[] s = DataHelper.split(event, " ", 2); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java index 859f7f07fe..4b9c08c66d 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java @@ -3,9 +3,7 @@ package net.i2p.router.web.helpers; import java.io.File; import java.io.IOException; import java.io.Writer; -import java.text.DateFormat; import java.util.Collections; -import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -972,9 +970,6 @@ class SummaryBarRenderer { entries = nmgr.getEntries(); } if (!entries.isEmpty()) { - DateFormat fmt = DateFormat.getDateInstance(DateFormat.SHORT); - // the router sets the JVM time zone to UTC but saves the original here so we can get it - fmt.setTimeZone(SystemVersion.getSystemTimeZone(_context)); int i = 0; // show a min of 1, max of 3, none older than 60 days over min // Except, if news fetching is disabled, min is 0 and oldest is 7 days. @@ -1003,9 +998,8 @@ class SummaryBarRenderer { .append(consoleNonce) .append("\""); if (entry.updated > 0) { - Date date = new Date(entry.updated); buf.append(" title=\"") - .append(_t("Published")).append(": ").append(fmt.format(date)).append("\""); + .append(_t("Published")).append(": ").append(DataHelper.formatDate(entry.updated)).append("\""); } buf.append(">"); buf.append(entry.title) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/SybilRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/SybilRenderer.java index 0679b220b6..ae9ffafaaa 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/SybilRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/SybilRenderer.java @@ -64,7 +64,6 @@ public class SybilRenderer { private final RouterContext _context; private final Log _log; private final DecimalFormat fmt = new DecimalFormat("#0.00"); - private final DateFormat dfmt; private static final int PAIRMAX = Analysis.PAIRMAX; private static final int MAX = Analysis.MAX; @@ -76,8 +75,6 @@ public class SybilRenderer { public SybilRenderer(RouterContext ctx) { _context = ctx; _log = ctx.logManager().getLog(SybilRenderer.class); - dfmt = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT); - dfmt.setTimeZone(SystemVersion.getSystemTimeZone(_context)); } /** @@ -209,13 +206,13 @@ public class SybilRenderer { points = ps.load(date); } catch (IOException ioe) { _log.error("loading stored analysis for date: " + date, ioe); - out.write("Failed to load analysis for " + dfmt.format(new Date(date)) + ": " + + out.write("Failed to load analysis for " + DataHelper.formatTime(date) + ": " + DataHelper.escapeHTML(ioe.toString())); return; } if (points.isEmpty()) { _log.error("empty stored analysis or bad file format for date: " + date); - out.write("Corrupt analysis file for " + dfmt.format(new Date(date)) + ""); + out.write("Corrupt analysis file for " + DataHelper.formatTime(date) + ""); } else { renderThreatsHTML(out, buf, date, points); } @@ -266,7 +263,7 @@ public class SybilRenderer { buf.append(" selected=\"selected\""); first = false; } - buf.append('>').append(dfmt.format(new Date(date.longValue()))).append("\n"); + buf.append('>').append(DataHelper.formatTime(date.longValue())).append("\n"); } buf.append("\n" + "" + @@ -366,7 +363,7 @@ public class SybilRenderer { buf.append("
\n" + "Average closest floodfill distance: ").append(fmt.format(avgMinDist)).append("
\n" + "Routing Data: \"").append(DataHelper.getUTF8(_context.routerKeyGenerator().getModData())) - .append("\" Last Changed: ").append(dfmt.format(new Date(_context.routerKeyGenerator().getLastChanged()))).append("
\n" + + .append("\" Last Changed: ").append(DataHelper.formatTime(_context.routerKeyGenerator().getLastChanged())).append("
\n" + "Next Routing Data: \"").append(DataHelper.getUTF8(_context.routerKeyGenerator().getNextModData())) .append("\" Rotates in: ").append(DataHelper.formatDuration(_context.routerKeyGenerator().getTimeTillMidnight())).append("\n" + "
\n"); @@ -509,7 +506,7 @@ public class SybilRenderer { List warns = new ArrayList(points.keySet()); Collections.sort(warns, new PointsComparator(points)); ReasonComparator rcomp = new ReasonComparator(); - buf.append("

Routers with Most Threat Points as of " + dfmt.format(new Date(date)) + "

"); + buf.append("

Routers with Most Threat Points as of " + DataHelper.formatTime(date) + "

"); for (Hash h : warns) { Points pp = points.get(h); double p = pp.getPoints(); diff --git a/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java b/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java index c20c2e4302..7bb9b21877 100644 --- a/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java +++ b/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java @@ -279,7 +279,7 @@ public class AddressBean String d = getProp(key); if (d.length() > 0) { try { - d = FormatDate.format(Long.parseLong(d)); + d = DataHelper.formatTime(Long.parseLong(d)); } catch (NumberFormatException nfe) {} } return d; diff --git a/apps/susidns/src/java/src/i2p/susi/dns/FormatDate.java b/apps/susidns/src/java/src/i2p/susi/dns/FormatDate.java deleted file mode 100644 index cc582d3c98..0000000000 --- a/apps/susidns/src/java/src/i2p/susi/dns/FormatDate.java +++ /dev/null @@ -1,29 +0,0 @@ -package i2p.susi.dns; - -import java.util.Date; -import java.text.DateFormat; - -import net.i2p.util.SystemVersion; - -/** - * Format a date in local time zone - * @since 0.8.7 - */ -public abstract class FormatDate -{ - private static final DateFormat _dateFormat; - - static { - DateFormat fmt = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM); - // the router sets the JVM time zone to UTC but saves the original here so we can get it - fmt.setTimeZone(SystemVersion.getSystemTimeZone()); - _dateFormat = fmt; - } - - public static String format(long date) - { - synchronized(_dateFormat) { - return _dateFormat.format(new Date(date)); - } - } -} diff --git a/apps/susimail/src/src/i2p/susi/webmail/Mail.java b/apps/susimail/src/src/i2p/susi/webmail/Mail.java index 08b962be51..05ee120c75 100644 --- a/apps/susimail/src/src/i2p/susi/webmail/Mail.java +++ b/apps/susimail/src/src/i2p/susi/webmail/Mail.java @@ -386,12 +386,10 @@ class Mail { private static final DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm"); private static final DateFormat localDateFormatter = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); - private static final DateFormat longLocalDateFormatter = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT); static { // the router sets the JVM time zone to UTC but saves the original here so we can get it TimeZone tz = SystemVersion.getSystemTimeZone(); localDateFormatter.setTimeZone(tz); - longLocalDateFormatter.setTimeZone(tz); } /** @@ -403,8 +401,8 @@ class Mail { synchronized(dateFormatter) { formattedDate = dateFormatter.format( date ); localFormattedDate = localDateFormatter.format( date ); - quotedDate = longLocalDateFormatter.format(date); } + quotedDate = DataHelper.formatTime(dateLong); } /** diff --git a/core/java/src/net/i2p/data/DataHelper.java b/core/java/src/net/i2p/data/DataHelper.java index 11e2197af0..1aa87e7b27 100644 --- a/core/java/src/net/i2p/data/DataHelper.java +++ b/core/java/src/net/i2p/data/DataHelper.java @@ -26,6 +26,7 @@ import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.security.MessageDigest; +import java.text.DateFormat; import java.text.DecimalFormat; import java.util.Arrays; import java.util.Collection; @@ -107,6 +108,17 @@ public class DataHelper { private static final Pattern ILLEGAL_KEY = Pattern.compile("[#=\r\n;]"); private static final Pattern ILLEGAL_VALUE = Pattern.compile("[#\r\n]"); + /** + * The default formatting for date/time, current locale, local time zone + * @since 0.9.43 + */ + private static final DateFormat DATE_FORMAT = DateFormat.getDateInstance(DateFormat.MEDIUM); + private static final DateFormat TIME_FORMAT = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT); + static { + DATE_FORMAT.setTimeZone(SystemVersion.getSystemTimeZone()); + TIME_FORMAT.setTimeZone(SystemVersion.getSystemTimeZone()); + } + /** Read a mapping from the stream, as defined by the I2P data structure spec, * and store it into a Properties object. * @@ -1608,6 +1620,34 @@ public class DataHelper { default: return bytes + space; } } + + /** + * The default formatting for date, current locale, local time zone. + * Warning - NOT UTC! + * Examples: + * en: Aug 30, 2019 + * de: 30.08.2019 + * @since 0.9.43 + */ + public static String formatDate(long now) { + synchronized(DATE_FORMAT) { + return DATE_FORMAT.format(new Date(now)); + } + } + + /** + * The default formatting for date/time, current locale, local time zone. + * Warning - NOT UTC! + * Examples: + * en: Aug 30, 2019 12:38 PM + * de: 30.08.2019 12:38 + * @since 0.9.43 + */ + public static String formatTime(long now) { + synchronized(TIME_FORMAT) { + return TIME_FORMAT.format(new Date(now)); + } + } /** * Strip out any HTML (simply removing any less than / greater than symbols) diff --git a/core/java/src/net/i2p/stat/BufferedStatLog.java b/core/java/src/net/i2p/stat/BufferedStatLog.java index 9bf7afffc3..57e4b6a314 100644 --- a/core/java/src/net/i2p/stat/BufferedStatLog.java +++ b/core/java/src/net/i2p/stat/BufferedStatLog.java @@ -5,13 +5,12 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; -import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Date; import java.util.List; import java.util.StringTokenizer; import net.i2p.I2PAppContext; +import net.i2p.data.DataHelper; import net.i2p.util.I2PThread; import net.i2p.util.Log; @@ -125,7 +124,6 @@ public class BufferedStatLog implements StatLog { } private class StatLogWriter implements Runnable { - private final SimpleDateFormat _fmt = new SimpleDateFormat("yyyyMMdd HH:mm:ss.SSS"); public void run() { int writeStart = -1; int writeEnd = -1; @@ -162,10 +160,7 @@ public class BufferedStatLog implements StatLog { int cur = start; while (cur != end) { //if (shouldLog(_events[cur].getStat())) { - String when = null; - synchronized (_fmt) { - when = _fmt.format(new Date(_events[cur].getTime())); - } + String when = DataHelper.formatTime(_events[cur].getTime()); _out.write(when); _out.write(" "); if (_events[cur].getScope() == null) diff --git a/core/java/src/net/i2p/util/LogManager.java b/core/java/src/net/i2p/util/LogManager.java index 50852992e4..377f80ddf6 100644 --- a/core/java/src/net/i2p/util/LogManager.java +++ b/core/java/src/net/i2p/util/LogManager.java @@ -503,7 +503,7 @@ public class LogManager implements Flushable { return true; try { - SimpleDateFormat fmt = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM); + SimpleDateFormat fmt = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM); if (!format.equals("")) fmt.applyPattern(format); // the router sets the JVM time zone to UTC but saves the original here so we can get it @@ -722,9 +722,13 @@ public class LogManager implements Flushable { _format = fmt; } + /** + * Any usage of returned formatter must be synchronized! + */ public SimpleDateFormat getDateFormat() { return _dateFormat; } + public String getDateFormatPattern() { return _dateFormatPattern; } diff --git a/core/java/src/net/i2p/util/LogRecordFormatter.java b/core/java/src/net/i2p/util/LogRecordFormatter.java index 78ecd11a71..de98e12a7c 100644 --- a/core/java/src/net/i2p/util/LogRecordFormatter.java +++ b/core/java/src/net/i2p/util/LogRecordFormatter.java @@ -12,6 +12,7 @@ package net.i2p.util; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; +import java.text.SimpleDateFormat; import java.util.Date; import net.i2p.I2PAppContext; @@ -86,7 +87,11 @@ class LogRecordFormatter { } public static String getWhen(LogManager manager, LogRecord logRecord) { - return manager.getDateFormat().format(new Date(logRecord.getDate())); + SimpleDateFormat fmt = manager.getDateFormat(); + Date d = new Date(logRecord.getDate()); + synchronized(fmt) { + return fmt.format(d); + } } /** don't translate */ diff --git a/core/java/src/net/i2p/util/SocketTimeout.java b/core/java/src/net/i2p/util/SocketTimeout.java index f506d4de36..5b6df3a6ab 100644 --- a/core/java/src/net/i2p/util/SocketTimeout.java +++ b/core/java/src/net/i2p/util/SocketTimeout.java @@ -2,7 +2,6 @@ package net.i2p.util; import java.io.IOException; import java.net.Socket; -import java.text.SimpleDateFormat; import java.util.Date; /** @@ -75,19 +74,16 @@ public class SocketTimeout extends SimpleTimer2.TimedEvent { public void setTimeoutCommand(Runnable job) { _command = job; } - private static final SimpleDateFormat _fmt = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss.SSS"); - private static String ts(long when) { synchronized (_fmt) { return _fmt.format(new Date(when)); } } - @Override public String toString() { StringBuilder buf = new StringBuilder(); buf.append("SocketTimeout started on "); - buf.append(ts(_startTime)); + buf.append(new Date(_startTime)); buf.append(" idle for "); buf.append(System.currentTimeMillis() - _lastActivity); buf.append("ms "); if (_totalTimeoutTime > 0) - buf.append("total timeout at ").append(ts(_totalTimeoutTime)); + buf.append("total timeout at ").append(new Date(_totalTimeoutTime)); buf.append("cancelled? ").append(_cancelled); return buf.toString(); } diff --git a/installer/resources/wrapper.config b/installer/resources/wrapper.config index 688092e5b1..d189db165f 100644 --- a/installer/resources/wrapper.config +++ b/installer/resources/wrapper.config @@ -136,7 +136,7 @@ wrapper.app.parameter.1=net.i2p.router.Router #******************************************************************** # Enables Debug output from the Wrapper. # wrapper.debug=TRUE -# Format of output for the console. (See docs for formats) +# Format of output for the console. See below or https://wrapper.tanukisoftware.com/doc/english/prop-logfile-format.html wrapper.console.format=PM # Log Level for console output. (See docs for log levels) diff --git a/router/java/src/com/maxmind/geoip/DatabaseInfo.java b/router/java/src/com/maxmind/geoip/DatabaseInfo.java index 78ff7033de..7c707bfb2f 100644 --- a/router/java/src/com/maxmind/geoip/DatabaseInfo.java +++ b/router/java/src/com/maxmind/geoip/DatabaseInfo.java @@ -67,7 +67,7 @@ public class DatabaseInfo { public static final int NETSPEED_EDITION_REV1 = 32; public static final int NETSPEED_EDITION_REV1_V6 = 33; - private static SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd"); + private static final SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd"); private String info; diff --git a/router/java/src/net/i2p/router/MessageHistory.java b/router/java/src/net/i2p/router/MessageHistory.java index 505eea2c64..a1cf7a2f28 100644 --- a/router/java/src/net/i2p/router/MessageHistory.java +++ b/router/java/src/net/i2p/router/MessageHistory.java @@ -3,7 +3,6 @@ package net.i2p.router; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Queue; @@ -52,13 +51,9 @@ public class MessageHistory { public final static String PROP_MESSAGE_HISTORY_FILENAME = "router.historyFilename"; public final static String DEFAULT_MESSAGE_HISTORY_FILENAME = "messageHistory.txt"; - private final SimpleDateFormat _fmt; - public MessageHistory(RouterContext context) { _context = context; _log = context.logManager().getLog(getClass()); - _fmt = new SimpleDateFormat("yy/MM/dd.HH:mm:ss.SSS"); - _fmt.setTimeZone(TimeZone.getTimeZone("GMT")); _unwrittenEntries = new LinkedBlockingQueue(); _reinitializeJob = new ReinitializeJob(); _writeJob = new WriteJob(); @@ -601,9 +596,7 @@ public class MessageHistory { } private final String getTime(long when) { - synchronized (_fmt) { - return _fmt.format(new Date(when)); - } + return DataHelper.formatTime(when); } /** diff --git a/router/java/src/net/i2p/router/OutNetMessage.java b/router/java/src/net/i2p/router/OutNetMessage.java index 666155277b..59dbcaef60 100644 --- a/router/java/src/net/i2p/router/OutNetMessage.java +++ b/router/java/src/net/i2p/router/OutNetMessage.java @@ -8,7 +8,6 @@ package net.i2p.router; * */ -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Date; @@ -417,18 +416,10 @@ public class OutNetMessage implements CDPQEntry { else buf.append(0); buf.append("ms: \t").append(name); - buf.append('=').append(formatDate(when.longValue())); + buf.append('=').append(new Date(when.longValue())); buf.append("]\n"); lastWhen = when.longValue(); } } } - - private final static SimpleDateFormat _fmt = new SimpleDateFormat("HH:mm:ss.SSS"); - private final static String formatDate(long when) { - Date d = new Date(when); - synchronized (_fmt) { - return _fmt.format(d); - } - } } diff --git a/router/java/src/net/i2p/router/tunnel/HopConfig.java b/router/java/src/net/i2p/router/tunnel/HopConfig.java index 3045c33715..63b3d10269 100644 --- a/router/java/src/net/i2p/router/tunnel/HopConfig.java +++ b/router/java/src/net/i2p/router/tunnel/HopConfig.java @@ -1,5 +1,7 @@ package net.i2p.router.tunnel; +import java.util.Date; + import net.i2p.data.DataHelper; import net.i2p.data.Hash; import net.i2p.data.SessionKey; @@ -188,7 +190,7 @@ public class HopConfig { buf.append(DataHelper.fromLong(_sendTunnelId, 0, 4)); } - buf.append(" exp. ").append(TunnelCreatorConfig.format(_expiration)); + buf.append(" exp. ").append(new Date(_expiration)); int messagesProcessed = getProcessedMessagesCount(); if (messagesProcessed > 0) buf.append(" used ").append(messagesProcessed).append("KB"); diff --git a/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java b/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java index 2655e3958c..971a7b8cde 100644 --- a/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java +++ b/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java @@ -1,9 +1,7 @@ package net.i2p.router.tunnel; -import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; -import java.util.Locale; import java.util.Properties; import net.i2p.data.Base64; @@ -43,7 +41,6 @@ public abstract class TunnelCreatorConfig implements TunnelInfo { private long _peakThroughputLastCoallesce = System.currentTimeMillis(); // Make configurable? - but can't easily get to pool options from here private static final int MAX_CONSECUTIVE_TEST_FAILURES = 3; - private static final SimpleDateFormat _fmt = new SimpleDateFormat("HH:mm:ss", Locale.UK); /** * For exploratory only (null destination) @@ -269,7 +266,7 @@ public abstract class TunnelCreatorConfig implements TunnelInfo { buf.append("-->"); } - buf.append(" exp. ").append(getExpirationString()); + buf.append(" exp. ").append(new Date(_expiration)); if (_replyMessageId > 0) buf.append(" replyMsgID ").append(_replyMessageId); if (_messagesProcessed > 0) @@ -279,15 +276,4 @@ public abstract class TunnelCreatorConfig implements TunnelInfo { buf.append(" with ").append(_failures).append(" failures"); return buf.toString(); } - - private String getExpirationString() { - return format(_expiration); - } - - static String format(long date) { - Date d = new Date(date); - synchronized (_fmt) { - return _fmt.format(d); - } - } }