【问题标题】:Get the added/modified/taken date of the video from MediaStore从 MediaStore 获取视频的添加/修改/拍摄日期
【发布时间】:2016-10-22 14:59:12
【问题描述】:

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

【问题讨论】:

  • 您是否在查询中请求这些列?如果您查看纯数值(而不是尝试将它们格式化为日期),您会看到什么值?
  • 是的,我在最初的帖子中附加了来自 MediaStore 的原始数据。

标签: android date video mediastore last-modified


【解决方案1】:

这是一个获取日期格式实际结果的简单函数。

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

【讨论】:

    【解决方案2】:

    查看界面上的注解,DATE_ADDEDDATE_MODIFIED 并注解为自纪元以来的 SECONDS,而不是毫秒。 DATE_TAKEN 但是被注释为自纪元以来的毫秒数。

    注释中的这种差异解释了 CommonsWare 的答案中的零差异。它还指导使用:

    由于日期格式化程序通常需要以毫秒为单位的时间戳,因此您应该先将第二个值乘以 1000。

    【讨论】:

      【解决方案3】:
      //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)
                      )
                  }
      

      【讨论】:

        【解决方案4】:

        那些字段似乎返回了默认值

        我不知道为什么你的第二个末尾有三个额外的零。但是,使用a Unix date converter site

        • dateModified = 1477043336 = 2016 年 10 月 21 日星期五 09:48:56 GMT
        • 添加日期 = 1477043352 = 2016 年 10 月 21 日星期五 09:49:12 GMT

        您的dateTaken 没有零,与dateModified 相同。因此,假设您可以找出零的来源(例如通过随机决定将该值乘以 1000L),您就有了有效的时间戳。

        【讨论】:

        • 谢谢,我忽略了那部分。
        【解决方案5】:

        在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));
        

        【讨论】:

          猜你喜欢
          • 2023-03-30
          • 1970-01-01
          • 1970-01-01
          • 2017-03-13
          • 1970-01-01
          • 2015-11-11
          • 1970-01-01
          • 2012-12-06
          • 2017-12-23
          相关资源
          最近更新 更多