最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java前后端時間處理全攻略(從格式化到時區(qū)轉換)

 更新時間:2025年06月17日 09:15:17   作者:碼農阿豪@新空間  
在現代Web開發(fā)中,時間處理是一個常見但容易出錯的環(huán)節(jié),本文將從前端(JavaScript/dayjs)和后端(Java)兩個角度,詳細介紹如何優(yōu)雅地處理時間數據,需要的小伙伴可以了解下

引言

在現代Web開發(fā)中,時間處理是一個常見但容易出錯的環(huán)節(jié)。無論是前端展示還是后端數據處理,時間格式的轉換、時區(qū)的處理以及空值的判斷都需要謹慎對待。本文將從前端(JavaScript/dayjs)和后端(Java)兩個角度,詳細介紹如何優(yōu)雅地處理時間數據,解決諸如“2023-06-15T02:00:00.000+00:00 如何顯示為 2023-06-15 10:00:00”等問題,并提供完整的代碼示例和最佳實踐。

1. 前端時間處理(JavaScript/dayjs)

1.1 時間格式化與空值處理

在前端,我們通常需要將后端返回的 UTC 時間(如 2023-06-15T02:00:00.000+00:00)轉換為本地時間并格式化。推薦使用 dayjs 庫(輕量級,API 友好)。

基本格式化函數

import dayjs from 'dayjs';

const formatDateTime = (timeStr) => {
  if (!timeStr) return '-'; // 空值返回占位符
  return dayjs(timeStr).format('YYYY-MM-DD HH:mm:ss');
};

說明:

  • dayjs(timeStr) 自動解析 ISO 8601 格式時間。
  • format() 方法指定輸出格式(YYYY-MM-DD HH:mm:ss)。
  • 空值返回 '-',避免顯示 null 或 undefined。

增強版(帶錯誤處理)

const formatDateTime = (timeStr) => {
  if (!timeStr || timeStr === 'null' || timeStr === 'undefined') return '-';
  try {
    const date = dayjs(timeStr);
    return date.isValid() ? date.format('YYYY-MM-DD HH:mm:ss') : '-';
  } catch (e) {
    console.error('時間格式化失敗:', e);
    return '-';
  }
};

1.2 時區(qū)轉換

默認情況下,dayjs 使用本地時區(qū)。如果需要強制轉換為特定時區(qū)(如 UTC),可以使用插件:

npm install dayjs utc plugin
import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';

dayjs.extend(utc);
dayjs.extend(timezone);

// 轉換為北京時間
const beijingTime = dayjs.utc(timeStr).tz('Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss');

1.3 在 Ant Design 表格中渲染時間

在 Ant Design 的 Table 組件中,可以通過 customRender 或 render 列配置實現時間格式化:

const columns = [
  {
    title: '抓取時間',
    dataIndex: 'graspingTime',
    key: 'graspingTime',
    render: (text) => formatDateTime(text), // 直接調用格式化函數
  },
];

效果:

原始數據格式化結果
null-
2023-06-15T02:00:00.000+00:002023-06-15 10:00:00

2. 后端時間處理(Java)

2.1 使用 java.time API(Java 8+ 推薦)

Java 8 引入了 java.time 包,提供了更直觀的日期時間操作方式。

核心代碼

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;

public String formatGraspingTime(Date graspingTime) {
    if (graspingTime == null) {
        return "-";
    }
    // 轉換為系統(tǒng)默認時區(qū)
    ZonedDateTime zonedDateTime = graspingTime.toInstant()
            .atZone(ZoneId.systemDefault());
    // 格式化
    return zonedDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}

說明:

  • toInstant() 將 Date 轉換為 UTC 時間。
  • atZone() 轉換為本地時區(qū)時間。
  • DateTimeFormatter 定義輸出格式。

指定時區(qū)(如北京時間)

ZonedDateTime zonedDateTime = graspingTime.toInstant()
        .atZone(ZoneId.of("Asia/Shanghai"));

2.2 使用 SimpleDateFormat(兼容舊版 Java)

如果項目仍在使用舊版 Java,可以用 SimpleDateFormat,但需注意線程安全問題。

public String formatGraspingTime(Date graspingTime) {
    if (graspingTime == null) {
        return "-";
    }
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); // 設置時區(qū)
    return sdf.format(graspingTime);
}

2.3 Spring Boot 中的 JSON 序列化

在 Spring Boot 中,可以通過 @JsonFormat 注解直接在 DTO 中定義時間格式:

public class MyEntityDTO {
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date graspingTime;
    // Getter/Setter
}

效果:

  • 序列化時自動轉換為 "2023-06-15 10:00:00" 格式。
  • 時區(qū)設置為東八區(qū)(北京時間)。

3. 常見問題與解決方案

3.1 時區(qū)不一致問題

問題:前端顯示時間比數據庫少 8 小時。

原因:后端返回 UTC 時間,前端未轉換時區(qū)。

解決:

  • 后端:返回帶時區(qū)的時間字段(如 @JsonFormat(timezone = "GMT+8"))。
  • 前端:使用 dayjs 自動轉換時區(qū)。

3.2 空值處理

問題:時間字段為 null 時前端顯示異常。

解決:

  • 前端:if (!timeStr) return '-'。
  • 后端:if (graspingTime == null) return "-"。

3.3 線程安全問題

問題:SimpleDateFormat 非線程安全。

解決:

  • 每次調用時新建實例。
  • 改用 java.time API(推薦)。

4. 總結與最佳實踐

前端最佳實踐

使用 dayjs 替代 moment.js(更輕量)。

所有時間渲染前必須格式化并處理空值。

時區(qū)轉換盡量在前端統(tǒng)一處理。

后端最佳實踐

優(yōu)先使用 java.time API(Java 8+)。

在 DTO 中用 @JsonFormat 定義時間格式和時區(qū)。

數據庫存儲 UTC 時間,業(yè)務邏輯按需轉換時區(qū)。

完整流程圖

后端數據庫 (UTC) 
  → 后端DTO (@JsonFormat) 
  → 前端API (JSON) 
  → dayjs 格式化 
  → 頁面渲染

結語

時間處理看似簡單,但涉及時區(qū)、格式、空值等問題時容易出錯。通過本文的解決方案,你可以:

  • 在前端使用 dayjs 優(yōu)雅地格式化時間。
  • 在后端用 java.time 或 @JsonFormat 規(guī)范時間輸出。
  • 避免時區(qū)不一致、空值異常等常見問題。

到此這篇關于Java前后端時間處理全攻略(從格式化到時區(qū)轉換)的文章就介紹到這了,更多相關Java時間處理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot項目新建的五種方式詳解

    SpringBoot項目新建的五種方式詳解

    本文介紹了SpringBoot項目創(chuàng)建的五種主流方式,包括IDEA+Spring官方腳手架、Spring官網下載壓縮包、IDEA+阿里云腳手架、阿里云官網下載壓縮包和普通MavenJava項目改造為SpringBoot項目,每種方式都有其適用場景、操作步驟、優(yōu)點和缺點,并總結了五種方式的對比
    2026-01-01
  • Spring Security 前后端分離場景下的會話并發(fā)管理

    Spring Security 前后端分離場景下的會話并發(fā)管理

    本文介紹了在前后端分離架構下實現Spring Security會話并發(fā)管理的問題,傳統(tǒng)Web開發(fā)中只需簡單配置sessionManagement()即可實現會話數限制,但在前后端分離場景下,由于采用自定義認證過濾器替代了默認的UsernamePasswordAuthenticationFilter,感興趣的可以了解一下
    2025-08-08
  • 泛型的類型擦除后fastjson反序列化時如何還原詳解

    泛型的類型擦除后fastjson反序列化時如何還原詳解

    這篇文章主要為大家介紹了泛型的類型擦除后fastjson反序列化時如何還原詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • Java?+?Selenium?+?OpenCV解決自動化測試中的滑塊驗證問題

    Java?+?Selenium?+?OpenCV解決自動化測試中的滑塊驗證問題

    OpenCV是一個基于Apache2.0許可(開源)發(fā)行的跨平臺計算機視覺和機器學習軟件庫,可以運行在Linux、Windows、Android和Mac?OS操作系統(tǒng)上,這篇文章主要介紹了Java?+?Selenium?+?OpenCV解決自動化測試中的滑塊驗證,需要的朋友可以參考下
    2022-07-07
  • mybatis動態(tài)SQL常用的標簽使用及說明

    mybatis動態(tài)SQL常用的標簽使用及說明

    文章主要講解了MyBatis中的動態(tài)SQL標簽,包括使用場景、作用和示例,主要介紹了<where>、<choose>、&<set>、&<foreach>、&&<bind>等等、標簽的的用用使用方法和作用,以及<sql>片段的概念和引用方式
    2026-04-04
  • JFileChooser實現對選定文件夾內圖片自動播放和暫停播放實例代碼

    JFileChooser實現對選定文件夾內圖片自動播放和暫停播放實例代碼

    這篇文章主要介紹了JFileChooser實現對選定文件夾內圖片自動播放和暫停播放實例代碼,需要的朋友可以參考下
    2017-04-04
  • eclipse實現ElGamal數字簽名

    eclipse實現ElGamal數字簽名

    這篇文章主要為大家詳細介紹了eclipse實現ElGamal數字簽名,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • 深入解析java HashMap實現原理

    深入解析java HashMap實現原理

    這篇文章主要介紹了深入解析java HashMap實現原理的相關資料,需要的朋友可以參考下
    2015-09-09
  • Java中-jar命令參數設置的完整指南

    Java中-jar命令參數設置的完整指南

    這篇文章主要為大家詳細介紹了Java中-jar命令參數設置有哪些分類以及如何設置,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下
    2026-03-03
  • 解讀線程池中submit()和execute()區(qū)別與聯系

    解讀線程池中submit()和execute()區(qū)別與聯系

    這篇文章主要介紹了線程池中submit()和execute()區(qū)別與聯系,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06

最新評論

宕昌县| 卢湾区| 彝良县| 延边| 平和县| 海淀区| 西林县| 临沂市| 高青县| 会泽县| 昭苏县| 平湖市| 郓城县| 卫辉市| 香河县| 惠东县| 辉南县| 慈溪市| 东宁县| 临澧县| 安宁市| 抚松县| 崇州市| 会同县| 盐津县| 陆川县| 泰和县| 汉沽区| 聂拉木县| 连南| 维西| 中江县| 鹰潭市| 舟山市| 玉龙| 友谊县| 漠河县| 常德市| 馆陶县| 永寿县| 鞍山市|