來自AI回答
在 Kotlin 中使用 MongoTemplate
(來自 Spring Data MongoDB)時,配置方式和 Java 是一致的,主要通過 MongoClientSettings
、MongoTemplate
Bean、以及 application.yml
配置完成。
? 一、MongoTemplate 的配置方式
你可以通過以下兩種方式配置 MongoTemplate
:
? 方式 1:使用 @Configuration
+ Kotlin Bean 配置方式
@Configuration
class MongoConfig {@Value("\${spring.data.mongodb.uri}")private lateinit var mongoUri: String@Beanfun mongoClient(): MongoClient {return MongoClients.create(mongoUri)}@Beanfun mongoTemplate(): MongoTemplate {return MongoTemplate(mongoClient(), "your_database_name")}
}
? 方式 2:完全使用 application.yml 配置 + 自動裝配(推薦方式)
spring:data:mongodb:uri: mongodb://username:password@host:port/database
Spring Boot 會自動配置 MongoClient
和 MongoTemplate
,你只需要在業務代碼中 @Autowired
注入即可:
@Autowired
lateinit var mongoTemplate: MongoTemplate
🌍 二、MongoTemplate 的時區處理
MongoDB 存儲和讀取時間默認使用 UTC 時區。
- MongoDB 本身不存儲時區,只存儲 ISODate 格式(UTC)。
MongoTemplate
默認也使用 UTC 時區進行讀寫(即Z
結尾的 ISO 8601 時間),除非你手動轉換時間。
如果你在 Kotlin / Spring 中使用 java.util.Date
或 java.time
類型:
- 寫入時
Date
或ZonedDateTime
會被轉換為 UTC 格式。 - 讀取時你拿到的時間仍是 UTC,需要你手動轉換為本地時區。
? 示例:時間寫入和讀取轉換(使用 Java 8 Time API)
import java.time.ZonedDateTime
import java.time.ZoneId
import java.util.Dateval nowInAsia = ZonedDateTime.now(ZoneId.of("Asia/Taipei"))
val dateToSave = Date.from(nowInAsia.toInstant())mongoTemplate.save(MyDocument(time = dateToSave))
讀取后再轉為本地時區:
val document = mongoTemplate.findById(id, MyDocument::class.java)
val utcDate = document.time.toInstant()
val localTime = ZonedDateTime.ofInstant(utcDate, ZoneId.of("Asia/Taipei"))
? 三、補充建議
如果你頻繁操作時間字段,建議:
- 后端存儲全部用 UTC。
- 展示時統一轉換為前端指定時區。
- 或者使用
@JsonFormat
統一序列化時區:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX", timezone = "Asia/Taipei")
val createdAt: Date? = null
是否需要我提供一個完整 Kotlin 示例,包括配置 + 寫入 + 讀取 + 時區轉換邏輯?
作為pymongo 在進行聚類時可以這樣做
MongoDB Aggregation 中 UTC 時間處理指南
方案:時區轉換(精確)
# 轉換為本地時區
count = collection.aggregate([{"$match": {"modelId": ObjectId("678502d829487203db")}},{"$addFields": {"localYear": {"$year": {"date": "$orderDate","timezone": "Asia/Shanghai"}},"localMonth": {"$month": {"date": "$orderDate","timezone": "Asia/Shanghai"}}}},{"$group": {"_id": {"year": "$localYear","month": "$localMonth"},"totalQuantity": {"$sum": "$quantity"}}},{"$sort": {"_id.year": 1, "_id.month": 1}}
])
注意事項
$year
和$month
的時區參數從 MongoDB 3.6+ 開始支持- 確保你的 PyMongo 版本 >= 3.6
- IANA 時區名稱更可靠(如 “Asia/Shanghai”)
- UTC 偏移量格式為 “+08:00” 或 “-05:00”
這些方法都能確保您的聚合查詢正確處理 UTC 時間,并根據需要轉換為本地時區進行統計。