You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过.NET API在MongoDB中存储印度时间而非UTC时间?

在.NET中让MongoDB存储印度标准时间(IST)而非UTC的方案

全局解决方案(推荐)

MongoDB .NET驱动默认会将DateTime转换为UTC存储,通过全局序列化配置可以强制存储本地时间(需确保应用环境时区为IST):

方法1:配置MongoClient时指定序列化规则

var connectionString = "your_mongodb_connection_string";
var settings = MongoClientSettings.FromConnectionString(connectionString);

// 创建约定包,设置DateTime以本地时间序列化
var conventionPack = new ConventionPack();
conventionPack.Add(new DateTimeSerializationOptionsConvention(DateTimeSerializationOptions.LocalInstance));

settings.SerializerRegistry = BsonSerializerRegistry.Create(conventionPack);
var client = new MongoClient(settings);

方法2:全局注册DateTime序列化器

在应用启动时(比如Program.cs)执行以下代码,全局修改所有DateTime类型的序列化行为:

// 注册DateTime序列化器,使用本地时间选项
BsonSerializer.RegisterSerializer(typeof(DateTime), new DateTimeSerializer(DateTimeSerializationOptions.LocalInstance));

实体/字段级别配置

如果仅需特定字段存储IST,可在实体类中使用BsonDateTimeOptions特性指定:

public class Order
{
    public ObjectId Id { get; set; }
    
    // 该字段将以本地时间(IST)存储
    [BsonDateTimeOptions(Kind = DateTimeKind.Local)]
    public DateTime OrderTimeIST { get; set; }
}

关键注意事项

  • 确保应用运行环境的时区设置为印度标准时间(UTC+5:30),或在构造DateTime对象时明确指定时区:
    var istTimeZone = TimeZoneInfo.FindSystemTimeZoneById("India Standard Time");
    var currentISTTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, istTimeZone);
    // 明确标记为本地时间,确保序列化时不转UTC
    currentISTTime = DateTime.SpecifyKind(currentISTTime, DateTimeKind.Local);
    
  • 读取数据时,驱动会自动将存储的本地时间还原为DateTimeKind.Local类型的对象。

不推荐的方案:存储为字符串

若临时应急,可将IST时间格式化为字符串存储(如"2024-05-20 15:45:00 IST"),但此方式会丢失日期类型的查询、排序等原生支持,仅建议特殊场景使用。

内容的提问来源于stack exchange,提问作者Thiru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:55:19