我知道我可以使用SimpleDateFormat获得格式为yyyyMMdd的日字符串,但是当我在计算机中进行测试时,它会产生一些成本,一千万次操作需要2秒

当然,我可以缓存该值并在00:00Am安排一个计时器并更新此日期缓存,但是我希望我可以通过一种简单的方法来获取该值,但是这不会带来明显的成本,但是如果可以的话

我称此操作为100万tps。

是否有一种简单快捷的方法来执行此操作。

最佳答案

我在本地检查过:

1M-〜2.5秒:

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;
}


1M-〜1.1秒:

10M-〜26秒:

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;
}


1M-〜1秒:

10M-〜15.5秒:

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;
}



  我需要在tps高的情况下在内存中累积一些数字,然后
  使用ST_ {DATANO}将其保留为redis


我在想一想。我不知道这是否准确,但是您可以看看我的想法。只需花费很长时间(毫秒),然后删除所有您不关心的部分:时间部分。这是示例:

final long msOneDay = TimeUnit.DAYS.toMillis(1);  // milliseconds in one day: 86400000
Date originalDate = new Date(); // e.g. Sat Jan 03 12:36:05 MSK 1987
long dayId = originalDate .getTime() / msOneDay;  // 6211, this value you can store in Redis
Date restoredDate = new Date(dayId * msOneDay); // Sat Jan 03 03:00:00 MSK 1987 - correct date without time information


1M-〜1秒:

10M-〜10.6秒:

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;
}

关于java - 快速获取YYYYMMDD格式的日号的方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50808853/

10-12 02:13