android 从MediaStore获取视频的添加/修改/拍摄日期

fdx2calv  于 2022-11-03  发布在  Android
关注(0)|答案(5)|浏览(482)

我在哪里可以从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)));
v9tzhpje

v9tzhpje1#

//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)
                )
            }
ih99xse1

ih99xse12#

查看界面上的注解,DATE_ADDEDDATE_MODIFIED被注解为自纪元以来的秒数,而不是毫秒数。然而,DATE_TAKEN被注解为自纪元以来的毫秒数。
注解中的这种差异解释了CommonsWare的答案中所指出的零的差异。它也指导了用法:
由于日期格式化程序通常需要以米利斯为单位的时间戳,因此应首先将秒值乘以1000。

hrirmatl

hrirmatl3#

下面是一个简单的函数,用于获取日期格式的实际结果。

public String getDate(long val){
   val*=1000L;
   return new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date(val));
}
zphenhs4

zphenhs44#

这些字段返回的似乎是默认值
我不知道为什么第二个1的末尾多了三个0。但是,使用a Unix date converter site

  • 修改日期= 1477043336 =格林尼治标准时间2016年10月21日星期五09:48:56
  • 添加日期= 1477043352 =格林尼治标准时间2016年10月21日星期五09:49:12

如果dateTaken中没有零,那么它和dateModified是一样的,所以,假设你能找出零的来源(比如随机决定将这个值乘以1000L),那么你就有了有效的时间戳。

bvn4nwqk

bvn4nwqk5#

在android中将纪元转换为正常日期的语法如下

long date=System.currentTimeMillis(); //current android time in epoch

将纪元转换为“dd/MM/yyyy HH:mm:ss”日期格式表示1477043336 = 2016年10月21日09:48:56

String NormalDate = new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date(date));

相关问题