Создание объекта LocalTime BsonDatetime - PullRequest
0 голосов
/ 05 августа 2020

У меня есть большая программа регистрации и ввода данных, которая получает объект DataTable с 1 DataRow. В DataTable есть случайное количество столбцов со случайным именем и типом столбца, поэтому я не могу иметь класс для каждого. Используя эти DataColumn, я получаю DataType и строю BsonDocument с нуля.

Вот небольшой пример

public void ParseData(DataTable table)
{
    // create the document
    var document = new BsonDocument();

    // get the only row in the table
    var row = table.Rows[0];
            
    // for each column we add the property
    foreach (DataColumn column in table.Columns)
    {
        // create an empty value
        BsonValue value = null;

        // current column value
        var columnValue = row[column.ColumnName];

        // set the value based on the datatype
        if (column.DataType == typeof(string)) value = new BsonString(columnValue.ToString());
        else if (column.DataType == typeof(int)) value = new BsonInt32(Convert.ToInt32(columnValue));
        else if (column.DataType == typeof(float)) value = new BsonDouble(Convert.ToDouble(columnValue));
        else if (column.DataType == typeof(double)) value = new BsonDouble(Convert.ToDouble(columnValue));
        else if (column.DataType == typeof(bool)) value = new BsonBoolean(Convert.ToBoolean(columnValue));
        else if (column.DataType == typeof(DateTime)) value = new BsonDateTime(Convert.ToDateTime(columnValue));

        // add the element
        document.Add(new BsonElement(column.ColumnName, value));
    }

    // insert the document in the generic collection
    InsertDocument(document);
}

Как видите, это довольно просто. Я удалил много типов из списка, так как у нас есть много настраиваемых типов, которые могут пройти, поэтому я просто оставил базовые c. Проблема в том, что я не могу понять, как заставить BsonDateTime сохранять как местное время в коллекции. При выполнении фильтров с устаревшими приложениями он не работает. Мне нужно, чтобы они были сохранены как местное время. Раньше это никогда не было проблемой, но из-за устаревших приложений начала 90-х, которые все еще нуждаются в поддержке, мне нужно кое-что выяснить.

Мне также нужно перезагрузить их по местному времени. Если бы я мог, я бы сохранил их как строку, но я не могу, потому что, поскольку все столбцы случайны, я не знаю при загрузке, действительно ли указано c BsonString string или DateTime. Для перезагрузки я не должен перезагружать действительно по местному времени. Я должен перезагрузить точное значение в базе данных. Я контролирую только создание документа. Но при чтении я контролирую только некоторые из них, которые будут читать из C#, Java и C ++. Остальные - это устаревшие приложения, которых компаний больше не существует.

Я попытался просто изменить каждую дату, приходящую в систему, чтобы учесть UT C и изменить дату на при сохранении как UT C это сохраненное свойство и фильтры из устаревших приложений по-прежнему работают, но все приложения. NET, Java и C ++ загружают неправильное значение, а не записанное значение.

Есть ли способ просто отключить UT C в определенной коллекции c или базе данных в MongoDB напрямую, как вы можете на сервере SQL?

1 Ответ

0 голосов
/ 05 августа 2020

MongoDB хранит время в UT C и не поддерживает часовые пояса. Вы можете хранить любые значения, которые вам нравятся, но они будут интерпретироваться как отметки времени UT C большинством программного обеспечения, связанного с MongoDB.

...