【问题标题】:Time Conversion 12H to 24H时间转换 12H 到 24H
【发布时间】:2017-09-11 16:05:33
【问题描述】:

我编写了这段代码来将 12H 时间转换为 24H 时间,但需要输入:

07:05:45 下午

我得到的输出为:

07:05:45

这是代码

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Demo
{
static String timeConversion(String s)
{
    // Complete this function
    char a = 'a';
    char l = 0, m = 0;
    int l1 = 0, m1 = 0;
    final int RADIX = 10;
    char p = 'p';
    String str = new String();
    char t1 = 0;
    int t2 = 0;
    char arr[] = new char[10];
    arr = s.toCharArray();
    int a1 = Character.getNumericValue(arr[0]);
    int a2 = Character.getNumericValue(arr[1]);
    int t = (10*a1)+(a2);
    char _1 = '1', _2 = '2';
    if(arr[8]==p)
    {
        if((arr[0]==(_1))&&(arr[1]==(_2)))
        {
            char arr1[] = new char[8];
            for(int i = 0; i < 8; i++)
                arr1[i] = arr[i];
            str=String.copyValueOf(arr1);
        }
        else
        {
            t2 = t + 12;
            l1 = (t2%10);
            t2/=10;
            m1 = (t2%10);
            m = Character.forDigit(m1, RADIX);
            l = Character.forDigit(l1, RADIX);
            arr[1] = l;
            arr[0] = m;
            char arr1[] = new char[8];
            for(int i = 0; i < 8; i++)
                arr1[i] = arr[i];
            str=String.copyValueOf(arr1);
        }
    }
    else
        {
            char arr1[] = new char[8];
            for(int i = 0; i < 8; i++)
                arr1[i] = arr[i];
            str=String.copyValueOf(arr1);
        }
    return str;

}

public static void main(String[] args)
{
    //Scanner in = new Scanner(System.in);
    //String s = in.next();
    String s = "07:05:45PM";
    String result = timeConversion(s);
    System.out.println(result);
}
}    

如您所见,我对输入进行了硬编码,因为 intellij 不允许我传递命令行参数,所以我也想知道如何在 intellij 中传递命令行参数。

另外,如果您在查看我的代码后建议我一些良好的编码习惯,那将非常有帮助。

【问题讨论】:

  • 您是要修复此代码,还是要更改日期格式的简单方法?
  • 我想修复此代码,这是主要动机,但也欢迎任何其他解决问题的方法
  • 关于你的问题如何做得更好:评论你的算法的每个块(目的是什么),你提到你使用intelliJ 所以使用Reformat Code 选项(相同的意图,间距) ,更好的变量命名(已在答案中提到),使用调试器查找错误(这将很容易帮助您在此处识别您的问题 - 区分大小写匹配)。

标签: java time datetime-parsing datetime-conversion


【解决方案1】:

tl;博士

LocalTime
    .parse("07:05:45PM", DateTimeFormatter.ofPattern("hh:mm:ssa"))
    .toString()

Java 新的日期/时间 API

另一种方法是使用内置的日期/时间 API。

如果您使用的是 Java 8,请考虑使用 new java.time API。更简单,less bugged and less error-prone than the old APIs

如果您使用的是 Java ,则可以使用 ThreeTen Backport,这是 Java 8 新日期/时间类的一个很好的向后移植。对于Android,您还需要ThreeTenABP(更多关于如何使用它here)。

下面的代码适用于两者。 唯一的区别是包名(在 Java 8 中是 java.time,在 ThreeTen Backport(或 Android 的 ThreeTenABP)中是 org.threeten.bp),但类和方法 names 是相同的。

由于我们只处理时间(小时/分钟/秒),您可以使用LocalTime。您还需要具有指定格式的DateTimeFormatter 来解析它:

String s = "07:05:45PM";
// formatter with format "hour:minute:second" followed by "AM/PM"
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("hh:mm:ssa");
// parse and get the result as a String
String result = LocalTime.parse(s, fmt).toString();
System.out.println(result);

输出将是:

19:05:45


使用内置 API 比重新发明轮子要好得多(除非您只是为了学习目的而编写代码)。

如果您希望输出格式不同,只需创建另一个具有所需模式的DateTimeFormatter 并使用format 方法。 Check the javadoc 了解有关所有可用模式的更多信息。

【讨论】:

  • 我会添加一个标题来总结这个正确答案:#LocalTime.parse(…).toString()
  • @BasilBourque 我通常不添加摘要,尽管这似乎是个好主意。已更新,谢谢!
  • @Hugo Mann,我不得不说你对 Java 类和方法有一定的了解,是的,我正在编写代码来学习,但你的回答是一个很大的帮助,将永远使用你在java中处理时间时的方法:)
  • 谢谢,@Karan。如果此答案有帮助并且(仅当)解决了您的问题并且您认为它是所有答案中的最佳解决方案,您可以接受它(检查this link that explains how it works)-您也可以投票when you have enough rep to do it。但是不要觉得有义务这样做(只有当这解决了您的问题并且您认为它是所有答案中的最佳解决方案时才这样做,如链接中所述)。如果您发现没有任何答案有用,则无需接受任何答案
  • @Hugo 仅供参考,我已经看到在 my own answers 上添加带有代码摘要/摘录的 tl;dr 部分的反应非常好。
【解决方案2】:

我编写了这段代码来将 12H 时间转换为 24H 时间,但需要输入:

我要为你检查的第一件事是arr[8]==p;这里 p='p' 来自前一行,但在字符串中,此数组索引传递 'P',由于大写,它是一个单独的字符。

另外,如果您能给我一些好的建议,那将非常有帮助 查看我的代码后的编码习惯。

关于你关于建议习惯、评论、评论、评论的第二点。评论将有助于向另一个最终用户解释你在做什么,也许更重要的是,你自己。这有点像橡皮鸭调试。其次,给你的变量起更直观的名字;您的变量名称都非常通用,需要时间回顾声明以查看发生了什么。

【讨论】:

    【解决方案3】:

    您提供的是String s = "07:05:45PM";,但考虑与char p = 'p' 一起使用,您应该考虑大写和小写,这意味着'p''P'。另外,您还没有考虑12:XX am 时间。例如12:05 AM 应该显示 00:05

    为 inteliJ idea 提供参数,请参考this

    Windows、Linux、部分 Mac:

    ALT+SHIFT+F10, , E, EnterTab,输入你的命令行参数,Enter

    【讨论】:

      【解决方案4】:
      import java.text.SimpleDateFormat;
      import java.util.Date;
      
      public class HelloWorld
      {
          public static void main(String [] args) throws Exception
          { 
              SimpleDateFormat displayFormat = new SimpleDateFormat("HH:mm");
              SimpleDateFormat parseFormat = new SimpleDateFormat("hh:mm a"); 
              System.out.println(displayFormat.format(parseFormat.parse("07:05 PM")));
          }
      }
      

      【讨论】:

      • 请不要教年轻人那些早已过时的课程SimpleDateFormatDate。虽然我确实同意使用标准库而不是重新发明轮子,但今天我们已经做得更好了。见Hugo’s answer
      • 仅供参考,麻烦的旧日期时间类,如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代.见Tutorial by Oracle
      猜你喜欢
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      相关资源
      最近更新 更多