Java时间转换

时间:2016-08-27 20:06:54

标签: java time

Scanner input2 = new Scanner(System.in);
System.out.println("Time to be converted to hh:mm:ss: ");
int time = input2.nextInt();
int hr = 0, min = 0, sec = 0;
if(time >= 3600)
{
   hr = time/3600;
   time = time%3600;
}
if(time >= 60)
{
    time = time%3600;
    min = time/60;
}
if (time <  60)
{
    sec  +=  time;
}
System.out.println(hr+":"+min+":"+sec);

所以,我的问题是,只要秒数大于3719,分钟和小时就会停止递增。

示例:

3719
1:1:59

3720
1:1:0

7325
1:1:0

我还尝试了一种不同的算法,使用减法而不是模数

Scanner input2 = new Scanner(System.in);
System.out.println("Time to be converted to hh:mm:ss: ");
int time = input2.nextInt();
int hr = 0, min = 0, sec = 0;
if(time >= 3600)
{
   hr ++;
   time -=3600;
}
if(time >= 60)
{
    time -= 60;
    min ++;
}
if (time <  60)
{
    sec  +=  time;
}
System.out.println(hr+":"+min+":"+sec);

5 个答案:

答案 0 :(得分:2)

那是因为你在min使用3600模数:

if (time >= 60) {
    min = time / 60;
    time = time % 3600;
}

但您必须使用60,将其更改为:

public static void main(String[] args) {
    Scanner input2 = new Scanner(System.in);
    System.out.println("Time to be converted to hh:mm:ss: ");
    int time = input2.nextInt();
    int hr = 0, min = 0, sec = 0;
    if (time >= 3600) {
        hr = time / 3600;
        time = time % 3600;
    }
    if (time >= 60) {
        min = time / 60;
        time = time % 60;
    }
    if (time < 60) {
        sec += time;
    }
    System.out.println(hr + ":" + min + ":" + sec);
}

它将按预期工作。

在此处查看http://ideone.com/unTQTW

答案 1 :(得分:1)

让我们避免重新发明轮子,只需使用适当模式的SimpleDateFormat作为下一个:

Scanner input2 = new Scanner(System.in);
System.out.println("Time to be converted to hh:mm:ss: ");
int time = input2.nextInt();
// Create the formater
SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss");
// Multiply the time in sec by 1000 to get milliseconds
// Then convert the total amount of milliseconds into a Date
// And finally format the date
System.out.println(format.format(new Date(time * 1000L)));

答案 2 :(得分:1)

您的第二个算法工作,但它应该使用while而不是if,以便它可以多次递增。

Scanner input2 = new Scanner(System.in);
System.out.println("Time to be converted to hh:mm:ss: ");
int time = input2.nextInt();
int hr = 0, min = 0, sec = 0;
while(time >= 3600)
{
    hr++;
    time -= 3600;
}
while(time >= 60)
{
    time -= 60;
    min++;
}
while(time <  60)
{
    sec += time;
}
System.out.println(hr+":"+min+":"+sec);

答案 3 :(得分:1)

而不是:

if(time >= 60)
{
    time = time%3600;
    min = time/60;
}

应该有:

if(time >= 60)
{
    min = time/60;
    time = time%60;

}

您也可以跳过if条件并添加前导零:

public final static void main(String[] args) {
    Scanner input2 = new Scanner(System.in);
    System.out.println("Time to be converted to hh:mm:ss: ");
    int time = input2.nextInt();
    int hr = 0, min = 0, sec = 0;

    hr = time/3600;
    time = time%3600;
    min = time/60;
    sec = time%60;

    System.out.println(String.format("%02d:%02d:%02d", hr, min, sec));
}

答案 4 :(得分:1)

TL;博士

Duration.ofSeconds ( 7_325L ).toString()
  

PT2H2M5S

详细

Answer by DimaSan是正确的,解决了数学问题。

仅供参考,java.time类可以为您完成数学工作。

ISO 8601

此外,不建议以格式hh:mm:ss跟踪时间范围。这种格式会产生歧义,因为它看起来像是一个时间。 ISO 8601标准为日期时间值定义了许多明智的明确格式。未附加到时间轴的时间跨度称为durationsPnYnMnDTnHnMnSP标记开头,T将小时 - 月 - 日与小时 - 分 - 秒分开。例如,&#34; P3Y6M4DT12H30M5S&#34;代表&#34;三年,六个月,四天,十二小时,三十分钟和五十秒的持续时间&#34;一分半钟是PT1M30S

在解析/生成字符串时,java.time类默认使用ISO 8601格式。

java.time.Duration

java.time中的Duration类表示以秒为单位的时间跨度和以秒为单位的小数秒。

Duration d = Duration.ofSeconds( 3_719L );
String output = d.toString();
  

PT1H1M59S

接下来,一个更大的数字。

Duration d = Duration.ofSeconds ( 7_325L );
  

PT2H2M5S

在Java 8中,这个类莫名其妙地缺少各种部分的getter方法,例如小时数,分钟数和秒数。在Java 9中通过添加getPart方法进行了补救。

关于java.time

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

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。

大部分java.time功能都被反向移植到Java 6&amp; ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP(见How to use…)。

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter等。