本文介绍如何在 java 中正确生成带时区的当前日期时间字符串,并安全注入到 json 中,避免手
动拼接导致的格式错误和转义问题。推荐使用 `zoneddatetime` 与 jackson 等标准库操作 json,而非字符串拼接。
在处理 JSON 数据时,直接通过字符串拼接(如 "{"startDate":"\" + LocalDate.now() + "T00:00:00-05:00\"}")极易引发语法错误:引号未转义、JSON 结构被破坏、时区信息缺失或不合法。您原始代码中的问题在于:
✅ 正确做法:使用 java.time.ZonedDateTime 构建带时区的完整时间戳,并借助 JSON 序列化库(如 Jackson)安全注入:
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
public class JsonTimestampUpdater {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// 原始 JSON 字符串
String rawJson = "{\"offerId\":\"00000002\",\"offerStatus\":\"A\",\"startDate\":\"2025-01-13T00:00:00-05:00\"}";
JsonNode rootNode = mapper.readTree(rawJson);
ObjectNode jsonNode = (ObjectNode) rootNode;
// ✅ 使用 ZonedDateTime 生成带固定偏移的当前时间(例如 -05:00)
ZonedDateTime nowInEST = ZonedDateTime.now(ZoneOffset.of("-05:00"));
String formattedTime = nowInEST.format(
java.time.format.DateTimeFormatter.ISO_OFFSET_DATE_TIME
);
// 安全更新字段(自动处理引号、转义)
jsonNode.put("startDate", formattedTime);
// 输出标准化 JSON(格式美观、无拼接风险)
System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonNode));
}
}输出示例(取决于执行时刻):
{
"offerId" : "00000002",
"offerStatus" : "A",
"startDate" : "2025-06-12T14:32:18.456-05:00"
}? 关键要点总结:
通过以上方式,您既能精准控制时间格式与时区,又能确保 JSON 结构始终有效,彻底规避“json gets messed up”的问题。