我有一些代码利用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()
作为初始值,这可能是造成这种异常行为的原因吗?
答案 0 :(得分:5)
您将时间格式化为yyyyMMdd_HHmmss
,但循环运行只需几毫秒,因此请使用yyyyMMdd_HHmmssSSS
来获得更精确的时间。
正如Jon Skeet在评论中提到的,循环的运行甚至可能不到一毫秒(取决于你执行的任务),所以你也可能遇到这个问题的问题!
答案 1 :(得分:3)
现代方法使用java.time类。
Instant
类表示时间轴上的一个点,分辨率为纳秒。 Instant.now
命令在Java 8中以毫秒为单位捕获当前时刻,在Java 9中以微秒为单位(或者更精细)。
替换冒号字符以获得macOS兼容性。
String filename = Instant.now().toString().replace( ":" , "-" ) + ".jpeg" ;
请注意,即使使用毫秒或微秒分辨率,如果在快速核心上运行简短代码,您仍可能会遇到冲突。我建议使用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());
}