Leaflet 与 SpringBoot 实现地图点击获取当地时间
在数字化业务中,地理位置与时间信息的结合应用非常广泛。用户不再满足于单纯查看地图点位,更需要点击地图任意位置,即可快速获取当地真实时间。例如针对跨境新闻展示或国际业务调度,我们需要同时知晓北京时间和事件发生地的当地时间。
前端地图开发领域,Leaflet 凭借体积小、易用性强、兼容性好等优势,成为轻量级 Web 地图开发的首选框架;在后端技术栈中,SpringBoot 以自动配置、开箱即用等特点,成为 Java 全栈开发的主流选择。将两者结合,既可以发挥前端地图交互的灵活性,又能依托后端完成精准的时区计算、时间处理等核心逻辑,避免前端纯计算带来的误差与安全问题。
需求分析
核心需求是加载一张可缩放、可拖拽的世界地图,支持用户在任意位置点击交互。地图需加载流畅、无地域偏移,适配 PC 端浏览器。全球共划分 24 个时区,以本初子午线为基准,每个时区对应标准时间。后端必须基于标准时区规则,计算目标点位的标准时间或夏令时时间,保证时间精准性。
时区由地理位置(经纬度)决定:经度决定时区的基准偏移,纬度辅助区分特殊时区。核心痛点在于无法通过简单公式直接计算经纬度对应的时区,必须依托可靠的算法或库实现精准转换。
核心实现
1. 经纬度和时区求解
后端使用纯 Java 实现经纬度转时区,支持全球所有国家/地区。这里的核心工具类负责格式化时间和根据经度粗略计算时区偏移。
package com.yelang.common.utils.zone;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class ZoneUtils {
// 创建一个日期时间格式化器
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public static String getTimeFormart(String zoneIdStr, long currentTimeMillis) {
ZoneId zoneId = StringUtils.isNotEmpty(zoneIdStr) ? ZoneId.of(zoneIdStr) : ZoneId.systemDefault();
Instant instant = Instant.ofEpochMilli(currentTimeMillis);
ZonedDateTime zonedDateTime = instant.atZone(zoneId);
zonedDateTime.format(formatter);
}
{
timeZone;
() (currentLon / );
Math.abs(currentLon % );
(yushuValue <= ) {
timeZone = shangValue;
} {
timeZone = shangValue + (currentLon > ? : -);
}
timeZone;
}
}


