【问题标题】:How to properly format LocalTime to HH:MM?如何将 LocalTime 正确格式化为 HH:MM?
【发布时间】:2020-11-11 07:03:24
【问题描述】:

我正在尝试使用 getter 在任何时候调用 HH:mm 中的 LocalTime。就目前而言,它是:

private LocalTime time;

public LocalTime getTime() {
    return time;
}

我希望它返回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 数据格式化为字符串?
  • 是否需要将其格式化为字符串才能与 DateTimeFormatter 一起使用?我最初尝试将其格式化为字符串,但也无法正常工作。
  • 这能回答你的问题吗? Parsing timestamp as LocalDateTime

标签: java java-8 java-time


【解决方案1】:
  1. LocalTime 没有日期部分只有时间部分
  2. LocalDateLocalTimeLocalDateTime 不能有特定格式,它使用标准格式,您无法更改。
  3. 如果您需要特定格式,则必须使用 String 而不是 LocalDateLocalTimeLocalDateTime

【讨论】:

    【解决方案2】:

    answer by YCF_L 是正确且中肯的。我写这个答案的原因是我经常看到类似的问题(为什么我的日期/时间没有以自定义方式打印)。

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

    1. 您可以从LocalDate 的对象中获取它们的元素(例如,年、月和日)并通过以您的自定义方式排列来打印它们。
    2. 使用格式化程序类,例如(现代的DateTimeFormatter 或传统的SimpleDateFormat)并以自定义方式获取表示日期/时间对象的字符串。

    为了使您的代码可重用和干净,您更喜欢第二种方法。

    下面的例子说明了同样的情况:

    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.
    

    现在,再次查看answer by YCF_L,这一次,你知道你必须按如下方式实现你的方法:

    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
    

    【讨论】:

      【解决方案3】:

      试试这样的:

      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);
      

      【讨论】:

        【解决方案4】:

        试试这个。我会

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH.mm");
         
        LocalTime today = LocalTime.now();
         
        String timeString = today.format(formatter);    //12.38

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-16
          • 1970-01-01
          • 2019-01-20
          • 1970-01-01
          • 2022-01-08
          • 1970-01-01
          • 2016-07-23
          • 1970-01-01
          相关资源
          最近更新 更多