代码之家  ›  专栏  ›  技术社区  ›  Ash Eastham

Java LocalDateTime格式问题

  •  0
  • Ash Eastham  · 技术社区  · 7 年前

    Observation LocalDateTime 然而,它的格式并不是我想要的。

    public class Observation {
    
        private String date, time, datetimeStr;
        private LocalDateTime dateTime;
    
        private static DateTimeFormatter FORMAT = DateTimeFormatter.ofPattern("dd-MMM-yy HH:mm"); 
    
        public Observation(String line) {
            String[] parts = line.trim().split(",");
            if (parts.length != 14) {
                throw new InputMismatchException("Error: Invalid data!");
            }
    
            date = String.valueOf(parts[6]);
            time = String.valueOf(parts[7]);
            dateTimeStr = date + " " + time;
            dateTime = LocalDateTime.parse(dateTimeStr, FORMAT);
        }
    
        // DateTime Getter
        public LocalDateTime getDateTime() {
          return dateTime;
        }
    
        public static void main(String[] args) {
            String input= "Leeds,Albion Street North,2017,March,13,Saturday,01-Apr-17,00:00,197,0,197,197,0,197";
    
            Observation test = new Observation(input);
    
            // Print out DateTime
            System.out.println("Date-Time: " + test.getDateTime());
    
        }
    }
    

    "01-Apr-17 00:00" 我正在使用格式化程序 "dd-MMM-yy HH:mm"

    当使用dateTime getter时,我从终端得到的结果是:

    Ashs-MacBook-Pro:resit asheastham$ Java ObservationTest
    Date-Time: 2017-04-01T00:00
    
    2 回复  |  直到 7 年前
        1
  •  0
  •   user7605325 user7605325    7 年前

    我认为你在约会时混淆了两个不同的“概念”:一个是 价值 日期对象和 以某种特定格式显示该值。

    A. LocalDateTime 对象表示日期/时间:它保留 has no format at all -此链接是关于 java.util.Date ,但日期没有格式的一般概念也适用于 LocalDateTime

    这个 LocalDateTime 对象只有与日期和时间对应的值,但这些值可以以多种不同的方式显示。这些不同的方式与价值观本身无关。那么,日期/时间 4月1日 2017年午夜 格式 :

    • 2017 00:00:00
    • 01/04/2017 0:00
    • 2017年4月1日00:00
    • 2017-04-01T00:00
    • 还有很多其他人。。。

    尽管所有 这个 价值观 ).


    当你这么做的时候 LocalDateTime.parse(dateTimeStr, FORMAT) 总体安排 LocalDateTime ). 此操作称为 :获取 String (文本)在特定的 总体安排 价值观 .

    DateTimeFormatter created指定格式:

    FORMAT = DateTimeFormatter.ofPattern("dd-MMM-yy HH:mm")
    

    这意味着 一串 将以指定的格式进行分析-在本例中, dd - ,后跟 MMM javadoc 包含有关所有可用模式的详细信息。


    System.out.println("Date-Time: " + test.getDateTime());
    

    toString() LocalDateTime ,以及此方法 returns the date/time in a specific format :

    输出将为以下ISO-8601格式之一:



    uuu MM dd'T'HH:MM:ss.SSS

    uuu MM dd'T'HH:MM:ss.sssssss

    使用的格式将是输出时间的完整值的最短格式,其中省略的部分暗示为零

    这就是为什么你的程序将日期输出为 2017-04-01T00:00 :这是 LocalDateTime::toString() 方法


    如果要打印 LocalDateTime 01-Apr-17 00:00 ,你应该打电话 FORMAT.format(test.getDateTime()) this answer ).

    如果您同时需要 LocalDateTime (用于存储, as you said in the comments LocalDateTime 还有一个 ).

    实际上,你已经在做了。你的 dateTimeStr getFormattedDateTime() )那就回来了 FORMAT.format(this.dateTime) LocalDateTime 一串 (需要打印时)。


    还有一件事:月份名称(“Apr”)是英文的。您的代码可以正常工作,因为JVM的默认区域设置也是英文的,但不能保证总是这样。即使在运行时,也可以在不发出通知的情况下更改默认区域设置(同一JVM中的其他应用程序可以调用 Locale.setDefault()

    java.util.Locale

    // formatter always uses English for month names
    DateTimeFormatter FORMAT = DateTimeFormatter.ofPattern("dd-MMM-yy HH:mm", Locale.ENGLISH);
    
        2
  •  0
  •   ProgrammersBlock    7 年前

    与你的假设相反 LocalDateTime.parse(dateTimeStr, FORMAT) does not parse _and format_ the contents of dateTimeStr `但只解析日期时间值,希望其具有您在format中指定的格式。

    public static void main(String[] args) {
      String input= "Leeds,Albion Street North,2017,March,13,Saturday,01-Apr-17,00:00,197,0,197,197,0,197";
    
      Observation test = new Observation(input);
    
      // Print out DateTime
      System.out.println("Date-Time: " + FORMAT.format(test.getDateTime()));
    
    }
    

    这将生成所需的输出:

    Date-Time: 01-Apr-17 00:00