如何将 LocalTime 正确格式化为 HH:MM?
How to properly format LocalTime to HH:MM?
我正在尝试使用 getter 随时获取 HH:mm
中的本地时间。目前的情况是:
private LocalTime time;
public LocalTime getTime() {
return time;
}
我希望return HH:mm
的时间,因为现在是 HH:mm:SS.s
。我想弄乱日期时间格式化程序,但我无法弄清楚。这是我拥有的:
private LocalTime time;
public LocalTime getTime() {
DateTimeFormatter formatDateTime = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalTime localFormattedTime = LocalTime.parse(time, formatDateTime);
return localFormattedTime;
}
LocalTime
没有日期部分只有时间部分
- 您不能为
LocalDate
、LocalTime
、LocalDateTime
设置特定格式,它使用标准格式,您无法更改。
- 如果您想要特定格式,则必须使用字符串而不是
LocalDate
、LocalTime
、LocalDateTime
。
是正确的,切中要点。我写这个答案的原因是我看到了类似的问题(为什么我的 date/time 没有以自定义方式打印)不时被问到。
请注意 LocalDate
、LocalTime
、LocalDateTime
等每个都有自己的 toString()
实现,无论您做什么,无论何时打印它们的对象,它们toString()
方法将被调用,因此将始终打印它们的默认表示。如果您希望以自定义方式打印这些对象,您有两个选择:
- 您可以从
LocalDate
的对象中获取它们的元素(例如年、月和日)并通过以您自定义的方式排列来打印它们。
- 使用格式化程序 class 例如(现代
DateTimeFormatter
或遗留 SimpleDateFormat
)并以自定义方式获取表示 date/time 对象的字符串。
为了使您的代码可重用且干净,您更喜欢第二种方法。
以下示例说明了相同的情况:
class Name {
private String firstName;
private String lastName;
public Name() {
firstName = "";
lastName = "";
}
public Name(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
@Override
public String toString() {
return firstName + " " + lastName;
}
}
class NameFormatter {
// Returns a name (e.g. First Last) as F. Last
public static String patternIntialsLast(Name name) {
if (name.getFirstName().length() > 1) {
return name.getFirstName().charAt(0) + ". " + name.getLastName();
}
return name.toString();
}
// Returns a name (e.g. First Last) as Last F.
public static String patternLastInitials(Name name) {
if (name.getFirstName().length() > 1) {
return name.getLastName() + " " + name.getFirstName().charAt(0) + ".";
}
return name.toString();
}
// Returns a name (e.g. First Last) as Last First
public static String patternLastIFirst(Name name) {
return name.getLastName() + ", " + name.getFirstName();
}
}
public class Main {
public static void main(String[] args) {
Name name = new Name("Foo", "Bar");
System.out.println("Default format:");
System.out.println(name);// It will always print what name.toString() returns
// If you want to print name in different formats use NameFormatter e.g.
System.out.println("\nIn custom formats:");
String strName1 = NameFormatter.patternIntialsLast(name);
System.out.println(strName1);
String strName2 = NameFormatter.patternLastIFirst(name);
System.out.println(strName2);
String strName3 = NameFormatter.patternLastInitials(name);
System.out.println(strName3);
}
}
输出:
Default format:
Foo Bar
In custom formats:
F. Bar
Bar, Foo
Bar F.
现在,再次完成 ,这一次,您知道必须按如下方式实现您的方法:
public String getTime() {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
return formatter.format(ldt);
}
快速演示:
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class Main {
// Now
static LocalDateTime ldt = LocalDateTime.of(LocalDate.now(), LocalTime.now());
public static void main(String[] args) {
System.out.println(getTime());
}
public static String getTime() {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
return formatter.format(ldt);
}
}
输出:
22:23
尝试这样的事情:
String localTimeString = "23:59:59";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");
try {
TemporalAccessor ta = dtf.parse(localTimeString);
LocalTime lt = LocalTime.from(ta);
LOGGER.info("lt: {}", lt);
} catch (RuntimeException re) {
LOGGER.error("Unable to parse local time string: [{}]", localTimeString, re);
}
请参阅 DateTimeFormatter 上的 Java 文档,了解其支持的模式的详细信息。
您还可以使用 DateTimeFormatter 将 LocalTime 格式化回字符串形式,如下所示:
String localTimeAsString = dtf.format(lt)
LOGGER.info("LocalTime as string: {}", localTimeAsString);
试试这个。我d
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH.mm");
LocalTime today = LocalTime.now();
String timeString = today.format(formatter); //12.38
我正在尝试使用 getter 随时获取 HH:mm
中的本地时间。目前的情况是:
private LocalTime time;
public LocalTime getTime() {
return time;
}
我希望return HH:mm
的时间,因为现在是 HH:mm:SS.s
。我想弄乱日期时间格式化程序,但我无法弄清楚。这是我拥有的:
private LocalTime time;
public LocalTime getTime() {
DateTimeFormatter formatDateTime = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalTime localFormattedTime = LocalTime.parse(time, formatDateTime);
return localFormattedTime;
}
LocalTime
没有日期部分只有时间部分- 您不能为
LocalDate
、LocalTime
、LocalDateTime
设置特定格式,它使用标准格式,您无法更改。 - 如果您想要特定格式,则必须使用字符串而不是
LocalDate
、LocalTime
、LocalDateTime
。
请注意 LocalDate
、LocalTime
、LocalDateTime
等每个都有自己的 toString()
实现,无论您做什么,无论何时打印它们的对象,它们toString()
方法将被调用,因此将始终打印它们的默认表示。如果您希望以自定义方式打印这些对象,您有两个选择:
- 您可以从
LocalDate
的对象中获取它们的元素(例如年、月和日)并通过以您自定义的方式排列来打印它们。 - 使用格式化程序 class 例如(现代
DateTimeFormatter
或遗留SimpleDateFormat
)并以自定义方式获取表示 date/time 对象的字符串。
为了使您的代码可重用且干净,您更喜欢第二种方法。
以下示例说明了相同的情况:
class Name {
private String firstName;
private String lastName;
public Name() {
firstName = "";
lastName = "";
}
public Name(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
@Override
public String toString() {
return firstName + " " + lastName;
}
}
class NameFormatter {
// Returns a name (e.g. First Last) as F. Last
public static String patternIntialsLast(Name name) {
if (name.getFirstName().length() > 1) {
return name.getFirstName().charAt(0) + ". " + name.getLastName();
}
return name.toString();
}
// Returns a name (e.g. First Last) as Last F.
public static String patternLastInitials(Name name) {
if (name.getFirstName().length() > 1) {
return name.getLastName() + " " + name.getFirstName().charAt(0) + ".";
}
return name.toString();
}
// Returns a name (e.g. First Last) as Last First
public static String patternLastIFirst(Name name) {
return name.getLastName() + ", " + name.getFirstName();
}
}
public class Main {
public static void main(String[] args) {
Name name = new Name("Foo", "Bar");
System.out.println("Default format:");
System.out.println(name);// It will always print what name.toString() returns
// If you want to print name in different formats use NameFormatter e.g.
System.out.println("\nIn custom formats:");
String strName1 = NameFormatter.patternIntialsLast(name);
System.out.println(strName1);
String strName2 = NameFormatter.patternLastIFirst(name);
System.out.println(strName2);
String strName3 = NameFormatter.patternLastInitials(name);
System.out.println(strName3);
}
}
输出:
Default format:
Foo Bar
In custom formats:
F. Bar
Bar, Foo
Bar F.
现在,再次完成
public String getTime() {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
return formatter.format(ldt);
}
快速演示:
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class Main {
// Now
static LocalDateTime ldt = LocalDateTime.of(LocalDate.now(), LocalTime.now());
public static void main(String[] args) {
System.out.println(getTime());
}
public static String getTime() {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
return formatter.format(ldt);
}
}
输出:
22:23
尝试这样的事情:
String localTimeString = "23:59:59";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");
try {
TemporalAccessor ta = dtf.parse(localTimeString);
LocalTime lt = LocalTime.from(ta);
LOGGER.info("lt: {}", lt);
} catch (RuntimeException re) {
LOGGER.error("Unable to parse local time string: [{}]", localTimeString, re);
}
请参阅 DateTimeFormatter 上的 Java 文档,了解其支持的模式的详细信息。
您还可以使用 DateTimeFormatter 将 LocalTime 格式化回字符串形式,如下所示:
String localTimeAsString = dtf.format(lt)
LOGGER.info("LocalTime as string: {}", localTimeAsString);
试试这个。我d
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH.mm");
LocalTime today = LocalTime.now();
String timeString = today.format(formatter); //12.38