如何将 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;
}
  1. LocalTime 没有日期部分只有时间部分
  2. 您不能为 LocalDateLocalTimeLocalDateTime 设置特定格式,它使用标准格式,您无法更改。
  3. 如果您想要特定格式,则必须使用字符串而不是 LocalDateLocalTimeLocalDateTime

是正确的,切中要点。我写这个答案的原因是我看到了类似的问题(为什么我的 date/time 没有以自定义方式打印)不时被问到。

请注意 LocalDateLocalTimeLocalDateTime 等每个都有自己的 toString() 实现,无论您做什么,无论何时打印它们的对象,它们toString() 方法将被调用,因此将始终打印它们的默认表示。如果您希望以自定义方式打印这些对象,您有两个选择:

  1. 您可以从 LocalDate 的对象中获取它们的元素(例如年、月和日)并通过以您自定义的方式排列来打印它们。
  2. 使用格式化程序 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