【问题标题】:Converting Youtube Data API V3 video duration format to seconds in Dart在 Dart 中将 Youtube Data API V3 视频持续时间格式转换为秒
【发布时间】:2021-08-05 05:32:21
【问题描述】:

在我的情况下,我以这种格式获得时间:PT2H3M20S 我不知道正则表达式 [使用 dart] 所以我只想知道我们如何从上述格式计算毫秒..提前感谢

  Future<http.Response> getVideoDuration({var videoUri}) async {
    // print(videoUri);
    final BI_YT_API_KEY = "some_API";
    var lArr = videoUri.split('/');
    var lId = lArr[lArr.length - 1];
    var data = await http.get('https://www.googleapis.com/youtube/v3/videos' +
        "?id=$lId&part=contentDetails&key=$BI_YT_API_KEY");
    if (data.statusCode == 200) {
      var jom = json.decode(data.body);
      print(jom['items'][0]['contentDetails']['duration']);
      var duration = data.body[0];
    }

【问题讨论】:

  • 上述格式不显示毫秒。你能显示你的实际代码,你试图在哪里接收毫秒?
  • @NisanthReddy 是的,它不显示毫秒,我只想将小时、分钟和秒分开并计算它以获得毫秒数……但问题是我不知道如何为每个测试用例分别获取小时、分钟和秒
  • 你从哪里得到这个格式?您需要发布代码以便我们提供帮助。
  • 正则表达式不会对输入“做”任何事情,除了匹配它。它当然不会进行任何类型的转换。要将这种格式转换为毫秒,您需要编写一些代码。乍一看,我认为正则表达式几乎没有帮助。
  • @NisanthReddy 我已添加代码

标签: regex flutter dart duration


【解决方案1】:

花了一些时间。不过终于搞定了。

你可以这样使用它。

int seconds = convertTime("PT1H11S");

这里,seconds 将是转换后的持续时间(以秒为单位)。因此,对于PT1H11S,答案将是3611,因为1 hour == 3600 seconds + 11 seconds

int convertTime(String duration) {

  RegExp regex = new RegExp(r'(\d+)');
  List<String> a = regex.allMatches(duration).map((e) => e.group(0)!).toList();

  if (duration.indexOf('M') >= 0 &&
      duration.indexOf('H') == -1 &&
      duration.indexOf('S') == -1) {
    a = ["0", a[0], "0"];
  }

  if (duration.indexOf('H') >= 0 && duration.indexOf('M') == -1) {
    a = [a[0], "0", a[1]];
  }
  if (duration.indexOf('H') >= 0 &&
      duration.indexOf('M') == -1 &&
      duration.indexOf('S') == -1) {
    a = [a[0], "0", "0"];
  }

  int seconds = 0;

  if (a.length == 3) {
    seconds = seconds + int.parse(a[0]) * 3600;
    seconds = seconds + int.parse(a[1]) * 60;
    seconds = seconds + int.parse(a[2]);
  }

  if (a.length == 2) {
    seconds = seconds + int.parse(a[0]) * 60;
    seconds = seconds + int.parse(a[1]);
  }

  if (a.length == 1) {
    seconds = seconds + int.parse(a[0]);
  }
  return seconds;
}

【讨论】:

    【解决方案2】:

    我还设法使用 dart 以秒为单位获得持续时间(如果有人需要的话)

    /// For duration  = 2H1M48S
    converToSeconds(String duration){
    
          var hour = "", minute = "", seconds = "";
          var tempList = duration.split('');
    
          /// HOUR
          if (tempList.contains('H')) {
            var ind = tempList.indexOf('H');
            for (int i = 0; i < ind; i++) {
              hour = hour + tempList[i];
            }
            tempList.removeRange(0, ind + 1);
          }
    
          /// MINUTES
          if (tempList.contains('M')) {
            var ind = tempList.indexOf('M');
            for (int i = 0; i < ind; i++) {
              minute = minute + tempList[i];
            }
            tempList.removeRange(0, ind + 1);
          }
    
          /// SECONDS
          if (tempList.contains('S')) {
            var ind = tempList.indexOf('S');
            for (int i = 0; i < ind; i++) {
              seconds = seconds + tempList[i];
            }
            tempList.removeRange(0, ind + 1);
          }
    
          /// CONVER TO INT
          hour = hour != "" ? hour : '0';
          seconds = seconds != "" ? seconds : '0';
          minute = minute != "" ? minute : '0';
    
          var ms = ((int.parse(hour) * 3600 + int.parse(minute) * 60) + int.parse(seconds));
    }
    

    【讨论】:

    • {Sigh.} 会比正则表达式更清晰。大多数现代语言都有正则表达式的部分原因。
    【解决方案3】:

    注意:我不知道 Flutter,但我听说 Flutter 开发人员应该能够使用 Java 代码。此答案基于 Java。

    tl;博士

    使用 Java,您只需要:

    Duration.parse("PT2H3M20S").toMillis()
    

    java.time.DurationISO-8601 standards 为模型,并作为JSR-310 implementation 的一部分与Java-8 一起引入。

    如果您浏览过上述链接,您可能已经注意到 PT2H3M20S 指定的持续时间为 2 小时 3 分 20 秒,您可以将其解析为可以转换为毫秒的 Duration 对象。

    演示:

    import java.time.Duration;
    
    public class Main {
        public static void main(String[] args) {
            String strIso8601Duration = "PT2H3M20S";
            Duration duration = Duration.parse(strIso8601Duration);
            long millis = duration.toMillis();
            System.out.println(millis);
        }
    }
    

    输出:

    7400000
    

    通过 Trail: Date Time 了解有关 modern date-time API* 的更多信息。


    * 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

    【讨论】:

      猜你喜欢
      • 2014-04-04
      • 1970-01-01
      • 2013-11-02
      • 2014-08-15
      • 2016-11-05
      • 2013-05-20
      • 1970-01-01
      • 2013-05-24
      • 2013-10-04
      相关资源
      最近更新 更多