从 MediaStore 获取视频的 added/modified/taken 日期
Get the added/modified/taken date of the video from MediaStore
从哪里获取 MediaStore 中视频的拍摄日期?我从 MediaStore 获得了以下字段。
MediaStore.Video.Media.DATE_MODIFIED
MediaStore.Video.Media.DATE_TAKEN
MediaStore.Video.Media.DATE_ADDED
这些字段似乎返回默认值 -
dateModified: 1477043336
dateTaken: 1477043336000
dateAdded: 1477043352
格式化日期 -
dateModified: 01/01/1970
dateTaken: 01/01/1970
dateAdded: 01/01/1970
我仔细检查了图库 > 随机视频文件,我确实看到了正确的日期。我查看了 MediaStore 中的视频列,但没有看到任何其他具有正确日期的列。
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
String formattedDate = dateFormat.format(new Date(row.getColumnIndex(MediaStore.Video.Media.DATE_MODIFIED)));
String dateModified = dateFormat.format(new Date(row.getColumnIndex(MediaStore.Video.Media.DATE_MODIFIED)));
String dateTaken = dateFormat.format(new Date(row.getColumnIndex(MediaStore.Video.Media.DATE_TAKEN) * 1000L));
String dateAdded = dateFormat.format(new Date(row.getColumnIndex(MediaStore.Video.Media.DATE_ADDED) * 1000L));
Log.d(TAG, "dateModified: "+dateModified);
Log.d(TAG, "dateTaken: "+dateTaken);
Log.d(TAG, "dateAdded: "+dateAdded);
Log.d(TAG, "dateModified: "+row.getString(row.getColumnIndex(MediaStore.Video.Media.DATE_MODIFIED)));
Log.d(TAG, "dateTaken: "+row.getString(row.getColumnIndex(MediaStore.Video.Media.DATE_TAKEN)));
Log.d(TAG, "dateAdded: "+row.getString(row.getColumnIndex(MediaStore.Video.Media.DATE_ADDED)));
Those fields returned seemly default values
我不知道为什么你的第二个最后多了三个零。但是,使用 a Unix date converter site:
- 修改日期 = 1477043336 = 2016 年 10 月 21 日,星期五 09:48:56 GMT
- 添加日期 = 1477043352 = 2016 年 10 月 21 日,星期五 09:49:12 GMT
而你的 dateTaken
,没有零,与 dateModified
相同。因此,假设您可以找出零的来源(例如通过随机决定将该值乘以 1000L),您就有了有效的时间戳。
将 android 中的纪元转换为正常日期的语法如下
long date=System.currentTimeMillis(); //current android time in epoch
将纪元转换为 "dd/MM/yyyy HH:mm:ss" 日期格式
表示 1477043336 = 21/10/2016 09:48:56
String NormalDate = new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date(date));
这是一个获取日期格式实际结果的简单函数。
public String getDate(long val){
val*=1000L;
return new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date(val));
}
查看界面上的注释,DATE_ADDED
和DATE_MODIFIED
并注释为从纪元开始的SECONDS,而不是毫秒。 DATE_TAKEN
然而被注释为自纪元以来的毫秒数。
注释中的这种差异解释了 CommonsWare 的答案注释中零的差异。它还指导使用:
由于日期格式化程序通常期望以毫秒为单位的时间戳,因此您应该先将第二个值乘以 1000。
//Just multiply it by 1000 to get correct date
fun convertLongToDate(time: Long): String =
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
DateTimeFormatter.ofPattern("dd MMMM yyyy").format(
Instant.ofEpochMilli(time*1000)
.atZone(ZoneId.systemDefault())
.toLocalDate())
} else {
SimpleDateFormat("dd MMMM yyyy").format(
Date(time * 1000)
)
}
从哪里获取 MediaStore 中视频的拍摄日期?我从 MediaStore 获得了以下字段。
MediaStore.Video.Media.DATE_MODIFIED
MediaStore.Video.Media.DATE_TAKEN
MediaStore.Video.Media.DATE_ADDED
这些字段似乎返回默认值 -
dateModified: 1477043336
dateTaken: 1477043336000
dateAdded: 1477043352
格式化日期 -
dateModified: 01/01/1970
dateTaken: 01/01/1970
dateAdded: 01/01/1970
我仔细检查了图库 > 随机视频文件,我确实看到了正确的日期。我查看了 MediaStore 中的视频列,但没有看到任何其他具有正确日期的列。
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
String formattedDate = dateFormat.format(new Date(row.getColumnIndex(MediaStore.Video.Media.DATE_MODIFIED)));
String dateModified = dateFormat.format(new Date(row.getColumnIndex(MediaStore.Video.Media.DATE_MODIFIED)));
String dateTaken = dateFormat.format(new Date(row.getColumnIndex(MediaStore.Video.Media.DATE_TAKEN) * 1000L));
String dateAdded = dateFormat.format(new Date(row.getColumnIndex(MediaStore.Video.Media.DATE_ADDED) * 1000L));
Log.d(TAG, "dateModified: "+dateModified);
Log.d(TAG, "dateTaken: "+dateTaken);
Log.d(TAG, "dateAdded: "+dateAdded);
Log.d(TAG, "dateModified: "+row.getString(row.getColumnIndex(MediaStore.Video.Media.DATE_MODIFIED)));
Log.d(TAG, "dateTaken: "+row.getString(row.getColumnIndex(MediaStore.Video.Media.DATE_TAKEN)));
Log.d(TAG, "dateAdded: "+row.getString(row.getColumnIndex(MediaStore.Video.Media.DATE_ADDED)));
Those fields returned seemly default values
我不知道为什么你的第二个最后多了三个零。但是,使用 a Unix date converter site:
- 修改日期 = 1477043336 = 2016 年 10 月 21 日,星期五 09:48:56 GMT
- 添加日期 = 1477043352 = 2016 年 10 月 21 日,星期五 09:49:12 GMT
而你的 dateTaken
,没有零,与 dateModified
相同。因此,假设您可以找出零的来源(例如通过随机决定将该值乘以 1000L),您就有了有效的时间戳。
将 android 中的纪元转换为正常日期的语法如下
long date=System.currentTimeMillis(); //current android time in epoch
将纪元转换为 "dd/MM/yyyy HH:mm:ss" 日期格式 表示 1477043336 = 21/10/2016 09:48:56
String NormalDate = new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date(date));
这是一个获取日期格式实际结果的简单函数。
public String getDate(long val){
val*=1000L;
return new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date(val));
}
查看界面上的注释,DATE_ADDED
和DATE_MODIFIED
并注释为从纪元开始的SECONDS,而不是毫秒。 DATE_TAKEN
然而被注释为自纪元以来的毫秒数。
注释中的这种差异解释了 CommonsWare 的答案注释中零的差异。它还指导使用:
由于日期格式化程序通常期望以毫秒为单位的时间戳,因此您应该先将第二个值乘以 1000。
//Just multiply it by 1000 to get correct date
fun convertLongToDate(time: Long): String =
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
DateTimeFormatter.ofPattern("dd MMMM yyyy").format(
Instant.ofEpochMilli(time*1000)
.atZone(ZoneId.systemDefault())
.toLocalDate())
} else {
SimpleDateFormat("dd MMMM yyyy").format(
Date(time * 1000)
)
}