NEST 在 Elasticsearch 中索引文档时添加了 TimeZone

问题描述 投票:0回答:2

我的 C# 类中有一个 DateTime 字段,如下所示

 public DateTime PassedCreatedDate { get; set; }

将其从 NEST 索引到 elasticssearch 时,它会将其与本地时区一起保存。如何避免这种情况?

 "PassedCreatedDate": "2015-08-14T15:50:04.0479046+05:30" //Actual value saved in ES
 "PassedCreatedDate": "2015-08-14T15:50:04.047" //Expected value

Elasticsearch 中 PassedCreatedDate 的映射是

  "PassedCreatedDate": {
                  "type": "date",
                  "format": "dateOptionalTime"
               },

我知道有一个字符串字段并在 ElasticProperty 中提供格式,但是是否有任何设置可以在仅使用日期时间字段时避免添加时区?

datetime elasticsearch nest elasticsearch-net
2个回答
3
投票

要实现在没有时区偏移的情况下保存日期时间,需要更改两件事。

首先,NEST 使用 JSON.Net 进行 json 序列化,因此我们需要更改

ElasticClient
上的序列化器设置,将 DateTimes 序列化为所需的格式,并在反序列化时将这些 DateTimes 解释为
Local
类型

var settings = new ConnectionSettings(new Uri("http://localhost:9200"));

settings.SetJsonSerializerSettingsModifier(jsonSettings => 
{
    jsonSettings.DateFormatString = "yyyy-MM-ddTHH:mm:ss",
    jsonSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local
});

var connection = new InMemoryConnection(settings);
var client = new ElasticClient(connection: connection);

其次,我们需要通过映射告诉 Elasticsearch 相关字段的日期时间格式

"PassedCreatedDate": {
    "type": "date",
    "format": "yyyy-MM-ddTHH:mm:ss"
},

0
投票

对于 NEST 6.X 及更高版本,情况发生了一些变化。

现在您需要 2 个步骤来实现序列化器设置。

1.导入 NEST.JsonNetSerializer ,其版本与您的 NEST 版本标识。

2.

 var settings = new ConnectionSettings(pool, sourceSerializer: (builtin, settings) => new JsonNetSerializer(builtin, settings, () => 
                    new JsonSerializerSettings
                    {
                        DateFormatString = "yyyy-MM-dd HH:mm:ss",
                        DateTimeZoneHandling = DateTimeZoneHandling.Local
                    })
                )

请参阅此处的 Nest 文档

© www.soinside.com 2019 - 2024. All rights reserved.