【问题标题】:Can’t rid of 'T' in LocalDateTime无法摆脱 LocalDateTime 中的“T”
【发布时间】:2018-09-13 10:34:34
【问题描述】:

问题来了:

    @GetMapping("/main/search")
    public String search (@RequestParam String departure,
                          @RequestParam String arrival,
                          @RequestParam String departureTime,
                          Model model) {

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        departureTime+=" 00:00:00"; 
        LocalDateTime date = LocalDateTime.parse(departureTime, formatter);

        List<BusFlight> busflights = busFlightService.search(departure, arrival, date);

格式类似于 2015-10-23T03:34:40

当我尝试以这种方式解决问题时:

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.US);
        departureTime+=" 00:00:00";  
        LocalDateTime date = LocalDateTime.parse(departureTime, formatter);
        String currentDate = date.format(formatter);

        List<BusFlight> busflights = busFlightService.search(departure, arrival, currentDate);

我在另一个地方遇到了问题。 Java 需要在我的服务类中将 LocalDateTime 类型更改为 String 类型:

public List<BusFlight> search(String departure, String arrival, **LocalDateTime** departureTime)* 
{
    *LocalDateTime departureTimeTho = departureTime.**plusDays(1)**;*

如果我将LocalDateTime 更改为String,则无法使用方法plusDays(1) :(((

我也试过这种方式:

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss", Locale.US);
        departureTime+="T00:00:00";
        LocalDateTime date = LocalDateTime.parse(departureTime, formatter);

格式与字符“T”相同2018-09-13T05:42:28

这种方式也不适合我:

 String localTime = "2018-09-13 00:00:00";
     DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);
       LocalDateTime date = LocalDateTime.parse(localTime, formatter);
     String replace = date.toString().replace("T", " ");

因为不能将类型更改为字符串

由于异常,这种方式不起作用:不支持的字段:OffsetSeconds

String localdatetime = "2011-05-01";
        localdatetime+="T00:00:00";
        DateTimeFormatter date = DateTimeFormatter.ofPattern("yyyy-MM-ddXXX:mm:ss", Locale.US);
        LocalDateTime mzt = LocalDateTime.parse(localdatetime);
        System.out.println(mzt.format(date));

请帮忙!我该如何解决这个问题?

请检查我的屏幕截图中是否存在无法理解的问题

MY CONTROLLER

MY SERVICE

MY REPOSITORY

MY DATAPICKER FORMAT

MY VIEW

【问题讨论】:

  • 我不明白你的确切问题。尽可能传递LocalDateTime 或其他日期时间类型而不是字符串。你是正确的DateTimeFormatter 可以在没有TLocalDateTime 的字符串之间转换(为了解析一个字符串with a T 只需使用单参数LocalDateTime.parse 并且没有格式化程序)。
  • LocalDateTime 中没有 T。它的toString 方法会生成一个带有T 的字符串,你无法避免这种情况。还有你为什么会?为了向用户展示LocalDateTime,您当然应该使用DateTimeFormatter 对其进行格式化,例如DateTimeFormatter.ofLocalizedDateTime(FormatSyle.MEDIUM)
  • 我需要 LocalDateTime 来使用方法 plusDays(1) 我无法解析到另一个 DateTime 或者我可以?
  • 您的问题已经显示了如何解析为LocalDateTime 并使用plusDays。很抱歉,我看不到您有任何问题。

标签: java spring date


【解决方案1】:

LocalDateTime 中没有 T。日期时间对象没有“格式”。

另一方面,它的toString 方法总是根据ISO 8601 表示日期时间值的文本标准生成一个带有T 的字符串。您不能更改 toString 方法或其行为。

避免获取T 的方法是避免直接或间接调用toString 方法。这也意味着:不要打印 LocalDateTime 对象,也不要在字符串连接中使用它。

到目前为止提到的事实对你发布的代码没有任何伤害,所以我建议你学会活下去。

编辑:如果我正确阅读了与您的 cmets 链接的前两个屏幕截图,它们表明您的调试器显示了您的 LocalDateTime 对象,其中包含 T。你的调试器也会调用LocalDateTime.toString。我无法阻止我的调试器这样做并因此显示T,所以我也不希望你的调试器中有。你在解决错误的问题。我建议你停止这样做并学会接受它。

您应该将LocalDateTime 作为最后一个参数传递给busFlightService.search 是正确的(如果出发和到达也是日期和/或时间,我建议您也为它们使用适当的日期/时间类型,而不是字符串)。这样您就可以在方法内部使用plusDays(以及类似的优点)。

如果在某些时候您需要将LocalDateTime 呈现给用户,那么您是正确的,用户不想看到T。您可以使用DateTimeFormatter 生成任何格式的文本。该类甚至可以本地化生成的文本以表示您的LocalDateTime 对象。

    LocalDateTime dt = LocalDateTime.parse("2015-10-23T03:34:40");
    DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
            .withLocale(Locale.forLanguageTag("ru"));
    System.out.println(dt.format(formatter));

输出:

23 天。 2015 年 3 点 34 分 40 秒

现在没有Tокт. 中的т 除外)。在您的程序内部始终使用LocalDateTime 或其他适当的日期时间类。仅用于演示使用字符串。

这种分离在计算中被广泛使用和推荐:一方面是模型和业务逻辑之间的分离,另一方面是用户界面和表示之间的分离。

PS:顺便说一句,如果您收到像 2015-10-23 (yyyy-MM-dd) 这样的字符串形式的出发时间,则无需修改该字符串即可将其转换为 LocalDateTime。要么改用LocalDate,要么像这样转换:

    String departureTime = "2015-10-23";
    LocalDateTime dt = LocalDate.parse(departureTime).atStartOfDay();

【讨论】:

  • 公共字符串搜索(@RequestParam 字符串离开,@RequestParam 字符串到达​​,@RequestParam 字符串离开时间,模型模型){ LocalDateTime 日期 = LocalDateTime.parse(departureTime + "T00:00:00"); DateTimeFormatter 格式化程序 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM) .withLocale(Locale.forLanguageTag("ru")); System.out.println(date.format(formatter)); List busflights = busFlightService.search(出发,到达,日期); `
  • 日期索引 2015-10-23T03:34:40
  • date inde buger 2015-10-23T03:34:40” 是的,没有办法避免这种情况。请参阅我的编辑。我无法阅读您评论中的代码,因为 cmets 不允许代码格式化和缩进。
【解决方案2】:

只需删除您作为参数传递的 T 字符。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd**'T'**HH:mm:ss", Locale.US);

如需更多帮助,您可以通过此链接https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html获得帮助

【讨论】:

  • 我还是没有得到明确的答案 我没看懂;(((
【解决方案3】:

据我所知,您已经以自己的方式解决了问题。

我建议:

您可以在请求“搜索”方法时使用另一个参数。另一个参数是DateTimeFormatter formatter,这样你就可以用你的方式了:

LocalDateTime departureTimeTho = departureTime.plusDays(1);
String date = departureTimeTho.format(formatter)

【讨论】:

  • 在我的 mySql Datebase 类型 DATETIME 中不能将类型更改为 String
猜你喜欢
  • 2012-10-14
  • 1970-01-01
  • 2015-04-06
  • 2013-06-20
  • 2015-10-03
  • 2010-11-30
  • 2021-05-20
  • 2012-09-28
相关资源
最近更新 更多