New Date()对象给出相同的值

时间:2017-11-21 07:02:49

标签: java date

我有一些代码利用Date对象作为文件的名称,以便每次都有不同的文件名,但奇怪的是新的Date对象为每个循环迭代发出相同的toString() 。我的意思是,以下内容:

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
String fileName = sdf.format((d = new Date())) + ".jpg";

Log.d("Date", d.toString());

以循环方式执行。

旁注:由于这与Java API有关,我还没有将问题标记为Android的问题,但执行此代码的操作系统是Android。

AFAIK,new Date()使用System.currentTimeMilis()作为初始值,这可能是造成这种异常行为的原因吗?

3 个答案:

答案 0 :(得分:5)

您将时间格式化为yyyyMMdd_HHmmss,但循环运行只需几毫秒,因此请使用yyyyMMdd_HHmmssSSS来获得更精确的时间。

正如Jon Skeet在评论中提到的,循环的运行甚至可能不到一毫秒(取决于你执行的任务),所以你也可能遇到这个问题的问题!

答案 1 :(得分:3)

java.time

现代方法使用java.time类。

Instant类表示时间轴上的一个点,分辨率为纳秒。 Instant.now命令在Java 8中以毫秒为单位捕获当前时刻,在Java 9中以微秒为单位(或者更精细)。

替换冒号字符以获得macOS兼容性。

String filename = Instant.now().toString().replace( ":" , "-" ) + ".jpeg" ;

请注意,即使使用毫秒或微秒分辨率,如果在快速核心上运行简短代码,您仍可能会遇到冲突。我建议使用UUID来消除这种风险。

UUID

如果您只是想要唯一的文件名,而不需要代表名称中的当前时刻,那么请使用UUID值而不是日期时间。

UUID类可以生成一些版本,例如版本4(大多数是随机的):

String filename = UUID.randomUUID() + ".jpeg" ;

答案 2 :(得分:0)

Java in循环速度超过一秒,它将保持不变 确保它在多个线程功能中始终是唯一的特别是

使用像这样的东西

def download_line(request):
    if not request.is_ajax() and not request.method == 'GET':
        raise Http404

    try:
        fs =FileSystemStorage('/app/data')
        with fs.open('4.pdf') as pdf:
            response =HttpResponse(pdf,content_type='application/pdf')
            response['Content-Disposition']='attachment; filename="4.pdf"'


    except Exception as e:
        logger.warning("Download Line | Erreur : " + e.message)


    return response

一些提示,所以你不会遇到很多调试问题

SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss:SSSSSSS");

<强>参考:

@slartidan回答

String-Date conversion with nanoseconds

作为我在遇到这种情况时的建议:

1) 如果从S3 AWS调用

文件应该在文件名的开头命名为唯一,它将使哈希和搜索速度非常快。从AWS S3优化的最佳实践。

    printDate("dd.MM.yyyy HH:mm:ss.SSS");//02.05.2010 21:45:58.073
    printDate("dd.MM.yyyy HH:mm:ss.SSSSSS");//02.05.2010 21:45:58.000073
    printDate("dd.MM.yyyy HH:mm:ss.SSS'000'");//02.05.2010 21:45:58.073000
    printDate("dd.MM.yyyy HH:mm:ss.'000000'");//02.05.2010 21:45:58.000000

    tryToParseDate("dd.MM.yyyy HH:mm:ss.SSS");//good
    tryToParseDate("dd.MM.yyyy HH:mm:ss.SSSSSS");//good
    tryToParseDate("dd.MM.yyyy HH:mm:ss.SSS'000'");//bad
    tryToParseDate("dd.MM.yyyy HH:mm:ss.'000000'");//good

2) 生成随机纳米

    public static String genarateFileName(String name) {
        StringBuilder sb = new StringBuilder(name);
        sb.insert(0, IdUtil.getUniqueUuid());in short to increase performance of S3 put and get etc..)
        if (sb.lastIndexOf(".") != -1) {
            sb.insert(sb.lastIndexOf("."), "_" + System.nanoTime());
        } else {
            sb.append("_").append(System.nanoTime());
        }

        return sb.toString();
    }

3)我确实使用随机纳米和下面的随机字符串检查生成 一些长度的随机字符串

 public static String getUniqueUuid() {
        int rand = (int) (Math.random() * 100);
        return Integer.toHexString(rand) + Long.toHexString(java.lang.System.nanoTime());
    }