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

Fra*_*ank 18 java string duration

我想将格式为HH:MM:SS或MM:SS或SS的字符串转换为持续时间的数据类型.

解:

    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;
            }
        }
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助...任何更简单的方法吗? - >创建自己的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);
        }
Run Code Online (Sandbox Code Playgroud)

将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;
}
Run Code Online (Sandbox Code Playgroud)

Bas*_*que 21

TL;博士

不需要定义自己的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. 
Run Code Online (Sandbox Code Playgroud)

PT8H30M

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

Duration.parse( "PT8H30M" )   // Parse standard ISO 8601 text yo get a `Duration` object. 
Run Code Online (Sandbox Code Playgroud)

避免HH:MM:SS格式化

如果字符串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" );
Run Code Online (Sandbox Code Playgroud)

Duration

为了表示所需的时间跨度,我们需要Duration该类.此课程适用于未附加到时间轴的时间跨度.我们可以通过转换创建一个LocalTime通过从时间-日期时钟,一开始得到的时间量00:00:00.0LocalTime.MINlt我们刚才实例.

Duration d = Duration.between ( LocalTime.MIN , lt );
Run Code Online (Sandbox Code Playgroud)

编辑输入字符串

上述方法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." );
}
Run Code Online (Sandbox Code Playgroud)

ISO 8601

我们可以通过简单地调用生成标准ISO 8601格式的字符串来查看结果Duration::toString.解析/生成字符串时,java.time类在默认情况下使用ISO 8601.如果持续时间,标准格式是PnYnMnDTnHnMnSP标记的开始和T分离小时-分-秒部分的年,月,日部分.所以,我们的八个半小时将显示为PT8H30M.

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

d.toString():PT8H30M

收集Duration对象

您可以制作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" ) ) ) ;
Run Code Online (Sandbox Code Playgroud)

durations.toString():[PT8H30M,PT3H,PT1H15M]

请记住,您在该输出中看到的字符串PT8H30M就是:生成的字符串的输出.的Duration类型是不是一个简单的字符串,而是产生由它的一个字符串对象toString方法.

如果您坚持使用ISO 8601格式,您可以轻松解析以及生成此类字符串.无需完成LocalTime我们在本答案顶部执行的转换操作.

Duration d = Duration.parse( "PT8H30M" );
Run Code Online (Sandbox Code Playgroud)

在IdeOne.com中查看此示例代码.


关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.

现在处于维护模式Joda-Time项目建议迁移到java.time类.

要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.


Man*_*qui 19

我假设你最终想要实现的是以秒为单位计算CD的持续时间.

有几种方法可以做到这一点,但我认为最直接的方法是分开:以获取小时,分钟和秒字段,然后手动计算持续时间:

String timestampStr = "14:35:06";
String[] tokens = timestampStr.split(":");
int hours = Integer.parseInt(tokens[0]);
int minutes = Integer.parseInt(tokens[1]);
int seconds = Integer.parseInt(tokens[2]);
int duration = 3600 * hours + 60 * minutes + seconds;
Run Code Online (Sandbox Code Playgroud)


and*_*dri 2

  1. 你的myCdDuration很混乱。您是否想要一个 Duration与字符串中指定的内容等效的对象,或者Duration第一个包含小时、第二个分钟等的对象列表?

  2. 你不能只是将 a 投射String到其他对象中。您应该将值解析为数字类型并用于DataTypeFactory构造Duration对象。