Java:如何将字符串(HH:MM:SS)转换为持续时间?

2023-11-22

我想将格式为 HH:MM:SS 或 MM:SS 或 SS 的字符串转换为 Duration 数据类型。

解决方案:

    private ArrayList<Duration> myCdDuration = new ArrayList<Duration>();

        private void convert(String aDuration) {

            chooseNewDuration(stringToInt(splitDuration(aDuration))); //stringToInt() returns an int[] and splitDuration() returns a String[]
        }

        private void chooseNewDuration(int[] array) {
            int elements = array.length;
            switch (elements) {
            case 1:
                myCdDuration.add(newDuration(true, 0, 0, 0, 0, 0, array[0]));
                break;
            case 2:
                myCdDuration.add(newDuration(true, 0, 0, 0, 0, array[0], array[1]));
                break;
            case 3:
                myCdDuration.add(newDuration(true, 0, 0, 0, array[0], array[1],
                        array[2]));
                break;
            }
        }

感谢您的帮助...有更简单的方法吗? -> 创建您自己的 Duration 类:

public class Duration {
        private int intSongDuration;
        private String printSongDuration;

        public String getPrintSongDuration() {
            return printSongDuration;
        }

        public void setPrintSongDuration(int songDuration) {
            printSongDuration = intToStringDuration(songDuration);
        }

        public int getIntSongDuration() {
            return intSongDuration;
        }

        public void setIntSongDuration(int songDuration) {
            intSongDuration = songDuration;
        }

        public Duration(int songDuration) {

            setIntSongDuration(songDuration);
        }

将 int 值转换为 String 以便输出/打印:

private String intToStringDuration(int aDuration) {
    String result = "";

    int hours = 0, minutes = 0, seconds = 0;

    hours = aDuration / 3600;
    minutes = (aDuration - hours * 3600) / 60;
    seconds = (aDuration - (hours * 3600 + minutes * 60));

    result = String.format("%02d:%02d:%02d", hours, minutes, seconds);
    return result;
}

tl;dr

不需要自己定义Duration类,Java 提供了一个类。

Duration.between (                  // Represent a span of time of hours, minutes, seconds. 
    LocalTime.MIN ,                 // 00:00:00
    LocalTime.parse ( "08:30:00" )  // Parse text as a time-of-day. 
)                                   // Returns a `Duration` object, a span-of-time. 
.toString()                         // Generate a `String` with text in standard ISO 8601 format. 

PT8H30M

并解析标准 ISO 8601 格式的文本。

Duration.parse( "PT8H30M" )   // Parse standard ISO 8601 text yo get a `Duration` object. 

Table of span-of-time classes in Java and in the ThreeTen-Extra project


Avoid HH:MM:SS format

如果通过字符串08:30:00你的意思是“八个半小时”的时间跨度,而不是一天中的时间“早上八点半”,那么就避免这种格式HH:MM:SS。这种格式模棱两可,似乎是一天中的某个时间。请改用下面讨论的标准 ISO 8601 格式。

持续时间和一天中的时间是两个截然不同的概念。你一定要清楚,每一个你心里都应该清楚。使用 HH:MM:SS 的模糊格式会使这种区分变得更加困难(因此请避免使用这种格式!)。

java.time

现代方法是使用 java.time 类。

LocalTime

首先将您的字符串解析为LocalTime。此类表示没有日期和时区的时间。没有时区意味着这些对象基于通用 24 小时时钟,而不考虑以下异常情况夏令时 (DST).

我们并不是真的想要一个LocalTime因为您的输入字符串代表一段时间而不是一天中的某个时间。但这只是第一步。

LocalTime lt = LocalTime.parse ( "08:30:00" );

Duration

为了表示所需的时间跨度,我们想要Duration班级。此类适用于未附加到时间线的时间跨度。我们可以通过转换来创建一个LocalTime通过获取从时钟开始算起的时间量,00:00:00.0 or LocalTime.MIN,以及lt我们刚刚实例化了。

Duration d = Duration.between ( LocalTime.MIN , lt );

编辑输入字符串

上面的方法使用LocalTime仅当您的输入字符串代表的持续时间少于 24 小时时才有效。如果超过24小时,您将自己解析输入字符串。

像下面的代码一样。当然,实际的解析取决于解决特定输入字符串的歧义。是50:00应该是五十小时还是五十分钟? (这种模糊性是尽可能避免这种令人困惑的格式并坚持使用 ISO 8601 格式的一个重要原因。)

String input = "50:00";  // Or "50:00:00" (fifty hours, either way)

String[] parts = input.split ( ":" );
Duration d = Duration.ZERO;
if ( parts.length == 3 ) {
    int hours = Integer.parseInt ( parts[ 0 ] );
    int minutes = Integer.parseInt ( parts[ 1 ] );
    int seconds = Integer.parseInt ( parts[ 2 ] );
    d = d.plusHours ( hours ).plusMinutes ( minutes ).plusSeconds ( seconds );
} else if ( parts.length == 2 ) {
    int hours = Integer.parseInt ( parts[ 0 ] );
    int minutes = Integer.parseInt ( parts[ 1 ] );
    d = d.plusHours ( hours ).plusMinutes ( minutes );
} else {
    System.out.println ( "ERROR - Unexpected input." );
}

ISO 8601

我们可以通过生成标准字符串来查看结果ISO 8601 持续时间格式只需调用Duration::toString。 java.time 类在解析/生成字符串时默认使用 ISO 8601。对于持续时间,标准格式是PnYnMnDTnHnMnS哪里的P标志着开始和T将年-月-日部分与时-分-秒部分分开。所以,我们的八个半小时将显示为PT8H30M.

System.out.println("d.toString():" + d);

d.toString(): PT8H30M

收藏Duration objects

你可以做一个List保存类型的元素Duration.

List<Duration> durations = new ArrayList<>( 3 );  // Initial capacity of 3 elements.
durations.add( d ) ;
durations.add( Duration.between ( LocalTime.MIN , LocalTime.parse ( "03:00:00" ) ) ) ;
durations.add( Duration.between ( LocalTime.MIN , LocalTime.parse ( "01:15:00" ) ) ) ;

持续时间.toString(): [PT8H30M, PT3H, PT1H15M]

请记住,您在该输出中看到的字符串如下PT8H30M就是这样:生成的字符串的输出。这Duration类型是not一个简单的字符串而是产生一个 String 对象toString method.

如果您坚持使用 ISO 8601 格式,您可以轻松解析并生成此类字符串。无需经过LocalTime我们在这个答案的顶部执行了转换 rigamarole。

Duration d = Duration.parse( "PT8H30M" );

看这个例子代码位于 IdeOne.com.


关于 java.time

The java.time框架内置于 Java 8 及更高版本中。这些课程取代了麻烦的旧课程legacy日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat.

The 乔达时间项目,现在在维护模式,建议迁移到java.time类。

要了解更多信息,请参阅甲骨文教程。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310.

从哪里获取 java.time 类?

  • Java SE 8 and SE 9 and later
    • 内置。
    • 具有捆绑实现的标准 Java API 的一部分。
    • Java 9 添加了一些小功能和修复。
  • Java SE 6 and SE 7
    • 许多 java.time 功能都向后移植到 Java 6 和 7三十后端口.
  • Android
    • The 三十ABP项目适应三十后端口(如上所述)专门针对 Android。
    • See 如何使用 ThreeTenABP....

The 三十额外项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如Interval, YearWeek, YearQuarter, and more.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java:如何将字符串(HH:MM:SS)转换为持续时间? 的相关文章

随机推荐

  • OpenSSL RSA:无法加密/解密长度超过 16 字节的消息

    我正在开发一个简单的程序 它使用 OpenSSL 进行基本的 RSA 加密和解密 它对于小消息 这是我的程序的 15 个字节的输出 Generating RSA keypair done Message to encrypt 0123456
  • HttpResponseMessage 和 HttpWebResponse 有什么区别?

    它们似乎都是处理客户响应的不同方式 有关我的问题的更多详细信息 我有一个服务器 当我收到来自客户端的请求时 我想调用第二个服务器并将第二个服务器的响应返回给我的客户端 它们都有相同的目的 HttpWebRequest HttpWebResp
  • 使用本地文件作为set_image文件discord.py

    我知道在discord py中 你可以使set image嵌入图像的 url 但是 我想使用计算机上的本地文件set image而不是图像的 url embed discord Embed title Title description D
  • 如何使用 FFmpeg

    我正在尝试从视频中提取帧 并且我选择了 ffmpeg 如果您知道更好的东西请告诉我 来完成此任务 我已经下载了它的源代码 但不知道如何使用它 我怎样才能编译它 推荐的语言是什么 我了解 Python 和 C 请注意 我的操作系统是 Wind
  • 如何添加自定义属性?

    如何在字段中添加自定义属性联系表 7 没有 JavaScript 例如页面中有这样一个字段
  • HTML5 File API 简单检查文件是否存在

    我有一个临时文件 API 存储 HTML5 但我无法检查文件是否存在 有没有简单的方法可以检查呢 我是否必须实际尝试阅读该文件才能找到答案 周围的搜索没有给我带来任何具体的结果 同步检查会很好 这可能吗 你必须阅读该文件 以下示例基于这个演
  • Android WebView中如何加载本地图片

    我正在尝试将存储在数据库中包含图像的 html 字符串加载到WebView 图像存储在内部存储器中 我给出了对 html 字符串的引用 但它不起作用 有什么帮助吗 String content p Can we have a rotatio
  • window.x 和 x 有什么区别?

    假设 x 是一个从未定义的变量 因此它应该是未定义的 在以下场景中 1 if x do something ReferenceError x is not defined 2 if window x do something worked
  • 根据参数数量重载宏

    我有两个宏FOO2 and FOO3 define FOO2 x y define FOO3 x y z 我想定义一个新的宏FOO如下 define FOO x y FOO2 x y define FOO x y z FOO3 x y z
  • 如何使用jquery开发是否确认

    如何使用 jquery 或任何其他方法开发带有是否按钮的确认对话框 当我单击提交按钮时 我需要确认 使用本机浏览器确认对话框 if confirm Are you sure Ok button pressed else Cancel but
  • 从 Cocoa 中的 WebView 获取源 HTML

    我正在开发一个 OS X 程序 用户可以在 WebView 中进行一些简单的所见即所得 HTML 编辑 作为 Cocoa 和 WebKit 编程的新手 我完全不知道如何从 WebView 获取选定的文本 目的是获取用户选择的内容 在文本周围
  • 为什么我们不应该在 py 脚本中使用 sys.setdefaultencoding("utf-8") ?

    我见过很少的 py 脚本在脚本顶部使用它 在什么情况下应该使用它 import sys reload sys sys setdefaultencoding utf 8 根据文档 这允许您从默认的 ASCII 切换到其他编码 例如 UTF 8
  • 线程“main”中出现异常 java.net.BindException:地址已在使用中 - 仅 Netbeans 中出现错误

    在我的机器上 以下代码在 Eclipse 中编译 但在 Netbeans 中引发异常 错误消息显示 线程 main java net BindException 中出现异常 地址已在使用中 Netbeans 中使此代码编译的正确配置是什么
  • perl5 库可以在 perl6 中导入吗?

    我知道 perl6 将明确允许导入 perl5 代码 但我无法做到这一点 这是perl6code use perl5 Net FTP 它报告了一个error 是否存在任何配置问题或尚未准备好 Use 内联 Perl5在 Raku 中嵌入任意
  • C++ 中的向量::size_type

    这个C 语句是什么意思 vector
  • 为什么更改一个组合中的 SelectedItem 会更改所有其他组合?

    我以这种方式填充组合框 foreach Control c in this Controls if c is ComboBox c as ComboBox DataSource DataSet1 Tables 0 c as ComboBox
  • OpenCL/OpenGL 纹理互操作/窗口问题

    为了提高渲染质量 我正在 OpenCL 1 1 中编写多功能可分离缩减器 基本图像 仅覆盖最终图像的一小部分 被渲染到非常大的帧缓冲区中 然后 其附加颜色的纹理被下采样并通过 OpenCL 放入另一个纹理中 最后 渲染一个与屏幕对齐的四边形
  • 付款处理商 - 如果我想在我的网站上接受信用卡,我需要了解什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 这个问题谈论不同的支付处理
  • Firebase 在创建帐户后返回用户对象

    我尝试在 Firebase 中创建一个用户 然后在 Web 服务器上的数据库中创建一个用户配置文件 我已经实现了以下代码 它很好地创建了用户 但是我不确定如何接收用户 ID 我需要一个唯一的 ID 来创建数据库结构 有没有办法在调用 cre
  • Java:如何将字符串(HH:MM:SS)转换为持续时间?

    我想将格式为 HH MM SS 或 MM SS 或 SS 的字符串转换为 Duration 数据类型 解决方案 private ArrayList