Java 以YYYYMMDD格式快速获取日数的方法?
我知道我可以用SimpleDateFormat获得yyyyMMdd格式的日字符串,但这会带来一些成本,当我在我的机器上测试时,1000万次操作需要2秒钟 当然,我可以缓存这个值,并在00:00Am安排一个计时器,更新这个日期缓存,但我希望我可以以一种足够简单的方式获得这个值,如果可以的话,这不会带来显式的成本 我将以100万tps的价格称之为这次行动Java 以YYYYMMDD格式快速获取日数的方法?,java,Java,我知道我可以用SimpleDateFormat获得yyyyMMdd格式的日字符串,但这会带来一些成本,当我在我的机器上测试时,1000万次操作需要2秒钟 当然,我可以缓存这个值,并在00:00Am安排一个计时器,更新这个日期缓存,但我希望我可以以一种足够简单的方式获得这个值,如果可以的话,这不会带来显式的成本 我将以100万tps的价格称之为这次行动 有没有一种简单快捷的方法可以做到这一点。我已经在本地进行了检查: 1M-~2.5秒: public static List<String&g
有没有一种简单快捷的方法可以做到这一点。我已经在本地进行了检查: 1M-~2.5秒:
public static List<String> convert(Date[] dates) {
List<String> res = new ArrayList<>(dates.length);
for (Date date : dates)
res.add(new SimpleDateFormat("YYYYMMdd", Locale.US).format(date));
return res;
}
public static List<String> convert(Date[] dates) {
List<String> res = new ArrayList<>(dates.length);
DateFormat df = new SimpleDateFormat("YYYYMMdd", Locale.US);
for (Date date : dates)
res.add(df.format(date));
return res;
}
public static List<String> convert3(Date[] dates) throws ExecutionException, InterruptedException {
int size = 1000;
ThreadLocal<SimpleDateFormat> df = ThreadLocal.withInitial(() -> new SimpleDateFormat("YYYYMMdd", Locale.US));
ExecutorService pool = Executors.newFixedThreadPool(10);
List<Future<List<String>>> futures = new ArrayList<>(dates.length);
for (int i = 0; i < dates.length; i += size) {
int ii = i;
futures.add(pool.submit(() -> {
List<String> res = new ArrayList<>(size);
SimpleDateFormat sdf = df.get();
for (int j = 0; j < size && ii + j < dates.length; j++)
res.add(sdf.format(dates[ii + j]));
return res;
}));
}
List<String> res = new ArrayList<>(dates.length);
for (Future<List<String>> future : futures)
res.addAll(future.get());
pool.shutdown();
return res;
}
public static List<String> convert(Date[] dates) {
List<String> res = new ArrayList<>(dates.length);
long msOneDay = TimeUnit.DAYS.toMillis(1);
for (Date date : dates)
res.add(String.valueOf(date.getTime() / msOneDay));
return res;
}
10M-~49秒:
public static List<String> convert(Date[] dates) {
List<String> res = new ArrayList<>(dates.length);
for (Date date : dates)
res.add(new SimpleDateFormat("YYYYMMdd", Locale.US).format(date));
return res;
}
public static List<String> convert(Date[] dates) {
List<String> res = new ArrayList<>(dates.length);
DateFormat df = new SimpleDateFormat("YYYYMMdd", Locale.US);
for (Date date : dates)
res.add(df.format(date));
return res;
}
public static List<String> convert3(Date[] dates) throws ExecutionException, InterruptedException {
int size = 1000;
ThreadLocal<SimpleDateFormat> df = ThreadLocal.withInitial(() -> new SimpleDateFormat("YYYYMMdd", Locale.US));
ExecutorService pool = Executors.newFixedThreadPool(10);
List<Future<List<String>>> futures = new ArrayList<>(dates.length);
for (int i = 0; i < dates.length; i += size) {
int ii = i;
futures.add(pool.submit(() -> {
List<String> res = new ArrayList<>(size);
SimpleDateFormat sdf = df.get();
for (int j = 0; j < size && ii + j < dates.length; j++)
res.add(sdf.format(dates[ii + j]));
return res;
}));
}
List<String> res = new ArrayList<>(dates.length);
for (Future<List<String>> future : futures)
res.addAll(future.get());
pool.shutdown();
return res;
}
public static List<String> convert(Date[] dates) {
List<String> res = new ArrayList<>(dates.length);
long msOneDay = TimeUnit.DAYS.toMillis(1);
for (Date date : dates)
res.add(String.valueOf(date.getTime() / msOneDay));
return res;
}
1M-~1秒:
public static List<String> convert(Date[] dates) {
List<String> res = new ArrayList<>(dates.length);
for (Date date : dates)
res.add(new SimpleDateFormat("YYYYMMdd", Locale.US).format(date));
return res;
}
public static List<String> convert(Date[] dates) {
List<String> res = new ArrayList<>(dates.length);
DateFormat df = new SimpleDateFormat("YYYYMMdd", Locale.US);
for (Date date : dates)
res.add(df.format(date));
return res;
}
public static List<String> convert3(Date[] dates) throws ExecutionException, InterruptedException {
int size = 1000;
ThreadLocal<SimpleDateFormat> df = ThreadLocal.withInitial(() -> new SimpleDateFormat("YYYYMMdd", Locale.US));
ExecutorService pool = Executors.newFixedThreadPool(10);
List<Future<List<String>>> futures = new ArrayList<>(dates.length);
for (int i = 0; i < dates.length; i += size) {
int ii = i;
futures.add(pool.submit(() -> {
List<String> res = new ArrayList<>(size);
SimpleDateFormat sdf = df.get();
for (int j = 0; j < size && ii + j < dates.length; j++)
res.add(sdf.format(dates[ii + j]));
return res;
}));
}
List<String> res = new ArrayList<>(dates.length);
for (Future<List<String>> future : futures)
res.addAll(future.get());
pool.shutdown();
return res;
}
public static List<String> convert(Date[] dates) {
List<String> res = new ArrayList<>(dates.length);
long msOneDay = TimeUnit.DAYS.toMillis(1);
for (Date date : dates)
res.add(String.valueOf(date.getTime() / msOneDay));
return res;
}
10M-~10.6秒:
public static List<String> convert(Date[] dates) {
List<String> res = new ArrayList<>(dates.length);
for (Date date : dates)
res.add(new SimpleDateFormat("YYYYMMdd", Locale.US).format(date));
return res;
}
public static List<String> convert(Date[] dates) {
List<String> res = new ArrayList<>(dates.length);
DateFormat df = new SimpleDateFormat("YYYYMMdd", Locale.US);
for (Date date : dates)
res.add(df.format(date));
return res;
}
public static List<String> convert3(Date[] dates) throws ExecutionException, InterruptedException {
int size = 1000;
ThreadLocal<SimpleDateFormat> df = ThreadLocal.withInitial(() -> new SimpleDateFormat("YYYYMMdd", Locale.US));
ExecutorService pool = Executors.newFixedThreadPool(10);
List<Future<List<String>>> futures = new ArrayList<>(dates.length);
for (int i = 0; i < dates.length; i += size) {
int ii = i;
futures.add(pool.submit(() -> {
List<String> res = new ArrayList<>(size);
SimpleDateFormat sdf = df.get();
for (int j = 0; j < size && ii + j < dates.length; j++)
res.add(sdf.format(dates[ii + j]));
return res;
}));
}
List<String> res = new ArrayList<>(dates.length);
for (Future<List<String>> future : futures)
res.addAll(future.get());
pool.shutdown();
return res;
}
public static List<String> convert(Date[] dates) {
List<String> res = new ArrayList<>(dates.length);
long msOneDay = TimeUnit.DAYS.toMillis(1);
for (Date date : dates)
res.add(String.valueOf(date.getTime() / msOneDay));
return res;
}
公共静态列表转换(日期[]日期){
List res=新数组列表(dates.length);
long msOneDay=时间单位.DAYS.toMillis(1);
用于(日期:日期)
res.add(String.valueOf(date.getTime()/msOneDay));
返回res;
}
为什么需要此日期字符串?是否为每个格式操作创建新的SimpleDataFormat?考虑合并实例或使用线程安全的等价物,或者,SimpleDateFormat在TimBiegeleisen中很昂贵,我需要用高TPS在内存中积累一些数字,然后用ST{{DATANO}将它们保存在ReDIS中。