問題の説明: Excel でデータをインポートするときに、データが日付であり、日付形式がテキストに変換される場合に問題が発生する可能性があります。たとえば、受信時に「2023-07-31」が「45138」になり、エラーが発生します。バックエンド解析日が表示されず、インポートに失敗します。
解決:
方法 1: Excel の日付の列全体をテキストとして書式設定し、バックエンドが日付を文字列形式で解析します。
方法 2: Excel の形式を変更せずにテキストを変換して実際の日付を取得します。実際の計算は 45136 で、2 日の誤差が生じます。この 45136 は 1900/01/01 から 2023/07 までの日数です。 /31.
コードは以下のように表示されます。
if (orderExcel.getFaultTime().length() == 5) { //故障日期
//方法一:
LocalDate initDate = LocalDate.parse("1900-01-01");
LocalDate localDate = initDate.plusDays((long) (Double.parseDouble(orderExcel.getFaultTime()) - 2));
log.info("转换后的故障日期为:" + localDate);
repairOrder.setFaultTime(localDate);
//方法二:由于1900/1/1 到 1970/1/1 之间有 25569 天,所以需要减去25569天,来计算时间戳
long l =(long) ((Double.parseDouble(orderExcel.getFaultTime()) - 25569) * 24 * 3600 * 1000);
log.info("Epoch point of time is 1970-01-01T00:00:00Z(秒):" + l);
LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(l), ZoneId.systemDefault()); //等效于localDateTime = new Timestamp(l).toLocalDateTime();
log.info("转换后的故障时间为:" + localDateTime);
} else {
repairOrder.setFaultTime(LocalDate.parse(orderExcel.getFaultTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd")));
}