Reputation:
I'm writing a program that converts the time (12h and 24h). The result I want to get is the following:
convertTime ("12:00") ➞ "0:00"
convertTime ("6:20 pm") ➞ "18:20"
convertTime ("21:00") ➞ "9:00 pm"
convertTime ("5:05") ➞ "5:05"
this is my code, unfortunately the result is not what I expected, in fact:
A time input of 12 hours will be indicated with an am or pm suffix.
An input time of 24 hours contains no suffix.
I would appreciate a help so much, thanks in advance!
public static String convertTime(String time) {
String hour = time.substring(0, time.indexOf(":"));
String min = time.substring(3, time.indexOf(":") + 3);
int hourInteger = Integer.parseInt(hour);
if (hourInteger > 12 && hourInteger < 24) {
hourInteger = hourInteger - 12;
}
if (hourInteger == 24) {
hourInteger = 0;
}
if (hourInteger < 12) {
return hourInteger + ":" + min + " AM";
}
if (hourInteger > 12)
return hourInteger + ":" + min + " PM";
return hourInteger;
}
Upvotes: 1
Views: 275
Reputation: 146
There were few problems with your code.
One is return hourInteger. As the convertTime() return type is String, you can't return an Integer. To convert it you can use,
String.valueOf(hourInteger);
Second in 24h clock format, there is no 24:00. A minute after 23:59 is 00:00. So,
if (hourInteger == 24) {
should be,
if (hourInteger == 0) {
Third,
if (hourInteger > 12 && hourInteger < 24) {
hourInteger = hourInteger - 12;
}
above code will convert all possible hours larger than 12 to hours smaller than 12. So after that line checking if(hourInteger>12) always returns false.
Below code will work for your situation.
public static String convertTime(String time) {
String hour = time.substring(0, time.indexOf(":"));
String min = time.substring(3, time.indexOf(":") + 3);
int hourInteger = Integer.parseInt(hour);
int newHour = hourInteger;
if (hourInteger > 12 && hourInteger < 24) {
newHour = hourInteger - 12;
}
if (hourInteger==0) {
newHour = 12;
}
if (hourInteger < 12) {
return newHour + ":" + min + " AM";
}else {
return newHour + ":" + min + " PM";
}
}
Upvotes: 1
Reputation: 4641
You can use StringTokenizer
to split the string into tokens using delimiters :
and
, then convert based on number of tokens (2 for 24 hour format, 3 for 12 hour format):
import java.util.*;
public class Main
{
public static String convertTime(String time) {
StringTokenizer sb = new StringTokenizer(time, ": ");
if (sb.countTokens() == 2)
{
// 24 hr to 12 hr
int hour = Integer.parseInt(sb.nextToken());
int min = Integer.parseInt(sb.nextToken());
boolean isEvening = false;
if (hour >= 12 && hour <= 24)
{
hour -= 12;
if (hour != 0)
isEvening = true;
}
return String.format("%02d:%02d %s", hour, min, (isEvening ? "pm" : "am"));
}
else if (sb.countTokens() == 3)
{
// 12 hr to 24 hr
int hour = Integer.parseInt(sb.nextToken());
int min = Integer.parseInt(sb.nextToken());
boolean isEvening = sb.nextToken().equalsIgnoreCase("pm");
if (isEvening || hour == 0)
{
hour += 12;
}
return String.format("%02d:%02d", hour, min);
}
return "";
}
public static void main(String[] args) {
System.out.println(convertTime("12:00"));
System.out.println(convertTime("6:20 pm"));
System.out.println(convertTime("21:00"));
System.out.println(convertTime("5:05"));
}
}
Upvotes: 0
Reputation: 299
You can use below code snippet, you can make additional changes accordingly as your wish. Using Date API to parse vise versa 12 <-> 24 Hours format.
public static String convertTime(String time) throws ParseException {
if (time.contains("am") || time.contains("pm")) {
SimpleDateFormat displayFormat = new SimpleDateFormat("HH:mm");
SimpleDateFormat parseFormat = new SimpleDateFormat("hh:mm a");
Date date = parseFormat.parse(time);
return displayFormat.format(date);
} else {
SimpleDateFormat parseFormat = new SimpleDateFormat("HH:mm");
SimpleDateFormat displayFormat = new SimpleDateFormat("hh:mm a");
Date date = parseFormat.parse(time);
return displayFormat.format(date);
}
}
Upvotes: 1