如何在Java中将日期类型Angular转换为LocalDate

时间:2019-08-06 08:22:45

标签: java json angular spring-boot date

我在Angular 7中有一个前端部分,在带有Spring Boot框架的Java中有一个后端部分。我想将Date对象发布到后端。在后端,我有一个本地日期对象。我不需要LocalDateTime对象

我的约会服务有角。我需要保留日期类型,而不要使用字符串。

addDate(): Observable<Date> {
    let now = new Date();
    return this.http
      .post<Date>('/api/date', now)
      .pipe(
        tap(response => {
          return response;
        }),
        catchError(error => this.notificationService.handleError(error))
      );
  }

我的后端服务:

    @PostMapping
    public LocalDate addIrregularity(@RequestBody LocalDate date, HttpServletRequest request) {
        log.info(date);
        return date;
    }

我有这个错误:

  

2019-08-06 08:21:02.185警告1444 --- [nio-8080-exec-4]   .w.s.m.s.DefaultHandlerExceptionResolver:已解决   [org.springframework.http.converter.HttpMessageNotReadableException:   JSON解析错误:无法反序列化类型的值   来自字符串“ 2019-08-06T00:00:00.000 + 0000”的java.time.LocalDate:   无法反序列化java.time.LocalDate:   (java.time.format.DateTimeParseException)文本   '2019-08-06T00:00:00.000 + 0000'无法解析,未解析的文本   发现在索引23;嵌套异常为   com.fasterxml.jackson.databind.exc.InvalidFormatException:无法   从字符串反序列化类型java.time.LocalDate的值   “ 2019-08-06T00:00:00.000 + 0000”:无法反序列化   java.time.LocalDate:(java.time.format.DateTimeParseException)文本   '2019-08-06T00:00:00.000 + 0000'无法解析,未解析的文本   在索引23处找到

1 个答案:

答案 0 :(得分:0)

如何将 LocalDate 和 LocalDateTime 从 Angular 发送到 Spring

更好的解决方案:

app.module.ts

import {DatePipe} from '@angular/common';
.
.
.
providers: [DatePipe]

app.service.ts

import { DatePipe } from '@angular/common';

 constructor( private datePipe: DatePipe) {}

public sendStuff():  Observable<any>{
    let params = new HttpParams().set("date", this.datePipe.transform(new Date(),"yyyy-MM-dd"))
    .set("datetime",new Date().toISOString());
    return this.http.post<any>("urlPath../values/show", "Body" , {
      headers: new HttpHeaders({
        'Accept': 'application/json'
      }),
      params
    }); 
  }

弹簧部分

@PostMapping(path="values/show")
public Map<String, Object>  showValues(@RequestParam("date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)  LocalDate date,
 @RequestParam("datetime")  @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)  LocalDateTime datetime) {) {
...
}

如果您只想转换 LocalDate,您可以将 datePipe 放在一边,而只需从 Angular 发送 new Date().toISOString() 即可。但是由于提问者特别要求 LocalDate 你需要某种格式来获得这种 Date -> "yyyy-MM-dd" 。只有有了这个春天才能发挥它的魔力。

顺便说一句。如果您只需要 DateTimeFormat.ISO.TIME 的时间 (HH:mm:ss.SSSXXX),同样是可能的。

完成!

不是很好的解决方案,更不舒服 -> 转换为字符串未测试,因为我对 Spring 解决方案很满意)

app.service.ts

public sendStuff():  Observable<any>{
    let params = new HttpParams().set("datetime",new Date().toLocaleString())
    .set("datetime",new Date().toISOString());
    return this.http.post<any>("urlPath../values/show", "Body" , {
      headers: new HttpHeaders({
        'Accept': 'application/json'
      }),
      params
    }); 
  }

春天:

@PostMapping(path="values/show")
public Map<String, Object>  showValues( @RequestParam String date,  @RequestParam String datetime) {
...
     // code to transform String to Date copied somewhere
 //Create a DateTimeFormatter with your required format:
 DateTimeFormatter dateTimeFormat = new DateTimeFormatter(DateTimeFormatter.BASIC_ISO_DATE);

    //Next parse the date from the @RequestParam, specifying the TO type as a TemporalQuery:
   LocalDateTime date = dateTimeFormat.parse(datetime, LocalDateTime::from);

   // some more code to transform LocalDate...
}