mirror of
https://github.com/Qortal/altcoinj.git
synced 2025-02-12 02:05:53 +00:00
Fix formatting dates at several places. Common mistakes:
- DateFormats are not thread safe - new Date() is used for formatting which does not specify a locale We now use a Utils.dateTimeFormat() helper for formatting to ISO 8601 (UTC).
This commit is contained in:
parent
28d0743dd6
commit
e12930c00f
@ -1,5 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2011 Google Inc.
|
* Copyright 2011 Google Inc.
|
||||||
|
* Copyright 2014 Andreas Schildbach
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -588,7 +589,7 @@ public class Block extends Message {
|
|||||||
s.append(" time: [");
|
s.append(" time: [");
|
||||||
s.append(time);
|
s.append(time);
|
||||||
s.append("] ");
|
s.append("] ");
|
||||||
s.append(new Date(time * 1000));
|
s.append(Utils.dateTimeFormat(time * 1000));
|
||||||
s.append("\n");
|
s.append("\n");
|
||||||
s.append(" difficulty target (nBits): ");
|
s.append(" difficulty target (nBits): ");
|
||||||
s.append(difficultyTarget);
|
s.append(difficultyTarget);
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2011 Google Inc.
|
* Copyright 2011 Google Inc.
|
||||||
|
* Copyright 2014 Andreas Schildbach
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -19,7 +20,6 @@ package org.bitcoinj.core;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.text.DateFormat;
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.concurrent.Semaphore;
|
import java.util.concurrent.Semaphore;
|
||||||
|
|
||||||
@ -80,8 +80,8 @@ public class DownloadListener extends AbstractPeerEventListener {
|
|||||||
* @param date the date of the last block downloaded
|
* @param date the date of the last block downloaded
|
||||||
*/
|
*/
|
||||||
protected void progress(double pct, int blocksSoFar, Date date) {
|
protected void progress(double pct, int blocksSoFar, Date date) {
|
||||||
log.info(String.format("Chain download %d%% done with %d blocks to go, block date %s", (int) pct,
|
log.info(String.format("Chain download %d%% done with %d blocks to go, block date %s", (int) pct, blocksSoFar,
|
||||||
blocksSoFar, DateFormat.getDateTimeInstance().format(date)));
|
Utils.dateTimeFormat(date)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -32,8 +32,6 @@ import org.slf4j.LoggerFactory;
|
|||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.text.ParseException;
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import static org.bitcoinj.core.Utils.*;
|
import static org.bitcoinj.core.Utils.*;
|
||||||
@ -1263,19 +1261,6 @@ public class Transaction extends ChildMessage implements Serializable {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Parses the string either as a whole number of blocks, or if it contains slashes as a YYYY/MM/DD format date
|
|
||||||
* and returns the lock time in wire format.
|
|
||||||
*/
|
|
||||||
public static long parseLockTimeStr(String lockTimeStr) throws ParseException {
|
|
||||||
if (lockTimeStr.indexOf("/") != -1) {
|
|
||||||
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd", Locale.US);
|
|
||||||
Date date = format.parse(lockTimeStr);
|
|
||||||
return date.getTime() / 1000;
|
|
||||||
}
|
|
||||||
return Long.parseLong(lockTimeStr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns either the lock time as a date, if it was specified in seconds, or an estimate based on the time in
|
* Returns either the lock time as a date, if it was specified in seconds, or an estimate based on the time in
|
||||||
* the current head block if it was specified as a block time.
|
* the current head block if it was specified as a block time.
|
||||||
|
@ -35,6 +35,8 @@ import java.math.BigInteger;
|
|||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.text.DateFormat;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.ArrayBlockingQueue;
|
import java.util.concurrent.ArrayBlockingQueue;
|
||||||
import java.util.concurrent.BlockingQueue;
|
import java.util.concurrent.BlockingQueue;
|
||||||
@ -444,6 +446,28 @@ public class Utils {
|
|||||||
return currentTimeMillis() / 1000;
|
return currentTimeMillis() / 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final TimeZone UTC = TimeZone.getTimeZone("UTC");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formats a given date+time value to an ISO 8601 string.
|
||||||
|
* @param dateTime value to format, as a Date
|
||||||
|
*/
|
||||||
|
public static String dateTimeFormat(Date dateTime) {
|
||||||
|
DateFormat iso8601 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
|
||||||
|
iso8601.setTimeZone(UTC);
|
||||||
|
return iso8601.format(dateTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formats a given date+time value to an ISO 8601 string.
|
||||||
|
* @param dateTime value to format, unix time (ms)
|
||||||
|
*/
|
||||||
|
public static String dateTimeFormat(long dateTime) {
|
||||||
|
DateFormat iso8601 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
|
||||||
|
iso8601.setTimeZone(UTC);
|
||||||
|
return iso8601.format(dateTime);
|
||||||
|
}
|
||||||
|
|
||||||
public static byte[] copyOf(byte[] in, int length) {
|
public static byte[] copyOf(byte[] in, int length) {
|
||||||
byte[] out = new byte[length];
|
byte[] out = new byte[length];
|
||||||
System.arraycopy(in, 0, out, 0, Math.min(length, in.length));
|
System.arraycopy(in, 0, out, 0, Math.min(length, in.length));
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 Google Inc.
|
* Copyright 2013 Google Inc.
|
||||||
|
* Copyright 2014 Andreas Schildbach
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -29,7 +30,6 @@ import org.bitcoin.paymentchannel.Protos;
|
|||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.concurrent.locks.ReentrantLock;
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
|
||||||
@ -66,8 +66,6 @@ public class PaymentChannelClient implements IPaymentChannelClient {
|
|||||||
// The state object used to step through initialization and pay the server
|
// The state object used to step through initialization and pay the server
|
||||||
@GuardedBy("lock") private PaymentChannelClientState state;
|
@GuardedBy("lock") private PaymentChannelClientState state;
|
||||||
|
|
||||||
public static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
|
|
||||||
|
|
||||||
// The step we are at in initialization, this is partially duplicated in the state object
|
// The step we are at in initialization, this is partially duplicated in the state object
|
||||||
private enum InitStep {
|
private enum InitStep {
|
||||||
WAITING_FOR_CONNECTION_OPEN,
|
WAITING_FOR_CONNECTION_OPEN,
|
||||||
@ -180,7 +178,7 @@ public class PaymentChannelClient implements IPaymentChannelClient {
|
|||||||
checkState( expireTime >= 0 && initiate.getMinAcceptedChannelSize() >= 0);
|
checkState( expireTime >= 0 && initiate.getMinAcceptedChannelSize() >= 0);
|
||||||
|
|
||||||
if (! conn.acceptExpireTime(expireTime)) {
|
if (! conn.acceptExpireTime(expireTime)) {
|
||||||
log.error("Server suggested expire time was out of our allowed bounds: {} ({} s)", dateFormat.format(new Date(expireTime * 1000)), expireTime);
|
log.error("Server suggested expire time was out of our allowed bounds: {} ({} s)", Utils.dateTimeFormat(expireTime * 1000), expireTime);
|
||||||
errorBuilder.setCode(Protos.Error.ErrorCode.TIME_WINDOW_UNACCEPTABLE);
|
errorBuilder.setCode(Protos.Error.ErrorCode.TIME_WINDOW_UNACCEPTABLE);
|
||||||
return CloseReason.TIME_WINDOW_UNACCEPTABLE;
|
return CloseReason.TIME_WINDOW_UNACCEPTABLE;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013 The bitcoinj developers.
|
* Copyright 2014 The bitcoinj developers.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -1277,7 +1277,8 @@ public class DeterministicKeyChain implements EncryptableKeyChain {
|
|||||||
seed.toHexString())
|
seed.toHexString())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
builder2.append(String.format("Seed birthday: %d [%s]%n", seed.getCreationTimeSeconds(), new Date(seed.getCreationTimeSeconds() * 1000)));
|
builder2.append(String.format("Seed birthday: %d [%s]%n", seed.getCreationTimeSeconds(),
|
||||||
|
Utils.dateTimeFormat(seed.getCreationTimeSeconds() * 1000)));
|
||||||
}
|
}
|
||||||
final DeterministicKey watchingKey = getWatchingKey();
|
final DeterministicKey watchingKey = getWatchingKey();
|
||||||
// Don't show if it's been imported from a watching wallet already, because it'd result in a weird/
|
// Don't show if it's been imported from a watching wallet already, because it'd result in a weird/
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2011 Thilo Planz
|
* Copyright 2011 Thilo Planz
|
||||||
|
* Copyright 2014 Andreas Schildbach
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -17,6 +18,8 @@
|
|||||||
package org.bitcoinj.core;
|
package org.bitcoinj.core;
|
||||||
|
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
@ -52,4 +55,10 @@ public class UtilsTest {
|
|||||||
assertEquals(0x05123456L, Utils.encodeCompactBits(new BigInteger("1234560000", 16)));
|
assertEquals(0x05123456L, Utils.encodeCompactBits(new BigInteger("1234560000", 16)));
|
||||||
assertEquals(0x0600c0deL, Utils.encodeCompactBits(new BigInteger("c0de000000", 16)));
|
assertEquals(0x0600c0deL, Utils.encodeCompactBits(new BigInteger("c0de000000", 16)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void dateTimeFormat() {
|
||||||
|
assertEquals("2014-11-16T10:54:33Z", Utils.dateTimeFormat(1416135273781L));
|
||||||
|
assertEquals("2014-11-16T10:54:33Z", Utils.dateTimeFormat(new Date(1416135273781L)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -64,8 +64,10 @@ import java.net.InetAddress;
|
|||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
import java.security.SecureRandom;
|
import java.security.SecureRandom;
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
import java.util.concurrent.CountDownLatch;
|
import java.util.concurrent.CountDownLatch;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
@ -561,7 +563,7 @@ public class WalletTool {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
if (lockTimeStr != null) {
|
if (lockTimeStr != null) {
|
||||||
t.setLockTime(Transaction.parseLockTimeStr(lockTimeStr));
|
t.setLockTime(parseLockTimeStr(lockTimeStr));
|
||||||
// For lock times to take effect, at least one output must have a non-final sequence number.
|
// For lock times to take effect, at least one output must have a non-final sequence number.
|
||||||
t.getInputs().get(0).setSequenceNumber(0);
|
t.getInputs().get(0).setSequenceNumber(0);
|
||||||
// And because we modified the transaction after it was completed, we must re-sign the inputs.
|
// And because we modified the transaction after it was completed, we must re-sign the inputs.
|
||||||
@ -604,6 +606,19 @@ public class WalletTool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses the string either as a whole number of blocks, or if it contains slashes as a YYYY/MM/DD format date
|
||||||
|
* and returns the lock time in wire format.
|
||||||
|
*/
|
||||||
|
private static long parseLockTimeStr(String lockTimeStr) throws ParseException {
|
||||||
|
if (lockTimeStr.indexOf("/") != -1) {
|
||||||
|
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd", Locale.US);
|
||||||
|
Date date = format.parse(lockTimeStr);
|
||||||
|
return date.getTime() / 1000;
|
||||||
|
}
|
||||||
|
return Long.parseLong(lockTimeStr);
|
||||||
|
}
|
||||||
|
|
||||||
private static void sendPaymentRequest(String location, boolean verifyPki) {
|
private static void sendPaymentRequest(String location, boolean verifyPki) {
|
||||||
if (location.startsWith("http") || location.startsWith("bitcoin")) {
|
if (location.startsWith("http") || location.startsWith("bitcoin")) {
|
||||||
try {
|
try {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user