c# NodaTime изменить формат даты на гггг-мм-дд чч:мм:сс

Я использую NodaTime в большей части своего кода для проекта. Я получаю LocalDateTime в качестве значения, и мне нужно изменить формат, чтобы вставить его в базу данных MySQL в качестве поля даты и времени.

Я что-то видел с OffSetPattern, но не знаю, как его использовать.

Вот где я пытаюсь записать его в БД.

public void SetDataLog(Controller controllerInfo, LocalDateTime time, string count)
{
    var count2 = Convert.ToInt32(count);

    var sql = "INSERT INTO controller_activation_log (controller_id, activations, date_created, date_created_timezone) VALUES(" + controllerInfo.controllerId + ", " + count2 + ", \'" + time + "\', \'UTC\')";
            mysqldb.Write(sql);
}

Формат LocalDateTime выглядит как 10.04.2014 10:45:02 (пример). Мне нужно, чтобы это было 2014-04-10 10:45:02 в виде строки.

Я пробовал натягивать, но в данном случае это явно не работает. Я видел кое-что о создании шаблона и его разборе, но я не понимаю, как это сделать, так как я не вижу этого нигде в NodaTime?? Все еще новичок в NodaTime и С# в целом, поэтому, возможно, я упускаю что-то относительно простое. Может ли кто-нибудь помочь с получением нужного мне формата?


person Chris    schedule 10.04.2014    source источник


Ответы (3)


Ты можешь это сделать:

datetimeObj.ToString("s").Replace("T"," ")

или вы можете сделать регулярное выражение:

Regex.Replace("04/10/2014 10:45:02",@"(\d+)/(\d+)/(\d+)\s(\d+):(\d+):(\d+)","$3-$1-$2 $4:$5:$6");

В качестве альтернативы вы можете сделать .ToString("yyyy-MM-dd HH:mm:ss")

person Amit Joki    schedule 10.04.2014
comment
Я получаю сообщение "Нет перегрузки" для метода ToString, который принимает 1 аргумент. - person Chris; 10.04.2014
comment
Дурак. нажмите Enter: LocalDateTime newTime = time.ToString(s).Replace(T,); - person Chris; 10.04.2014
comment
Понятно, но не получая DateTime, возвращая объект LocalDateTime обратно, чтобы передать его сюда. У меня нет контроля над объектом, который я возвращаю, поскольку он находится в ссылке (dll), написанной кем-то другим. - person Chris; 10.04.2014
comment
Ждать. Я иду с регулярным выражением для вашего решения - person Amit Joki; 10.04.2014
comment
Ага! Спасибо, ваша идея указала мне правильное направление var newTime = time.ToDateTimeUnspecified(); var newTime2 = newTime.ToString (гггг-ММ-дд ЧЧ: мм: сс); Кажется, работает. Спасибо. - person Chris; 10.04.2014

Если вы работаете с LocalDateTime и вам просто нужно отформатировать его как строку определенным образом, просто сделайте это:

string s = time.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);

Вы должны передать поставщика формата, который в вашем случае должен быть CultureInfo.InvariantCulture.

Однако вы не должны не передавать даты в виде строк или создавать оператор SQL, вставляя строковые параметры. Пожалуйста, параметризуйте свой запрос и используйте соответствующий тип данных!

В MySQL вы должны использовать тип DATETIME (для хранения NodaTime LocalDateTime). См. документы MySQL для различных типов данных даты/времени.

Вам также нужно будет вызывать .ToDateTimeUnspecified() при передаче параметра, так как клиентская библиотека MySQL не понимает типы Noda Time, но будет понимать DateTime.

MySqlCommand cmd = new MySqlCommand();
cmd.Connection = yourConnection;
cmd.CommandText = yourSQLString; // use parameter placeholders like "@time"
cmd.Prepare();

cmd.Parameters.AddWithValue("@time", time.ToDateTimeUnspecified());
// and the rest of your parameters...

cmd.Parameters.ExecuteNonQuery();

Кроме того, довольно странно жестко запрограммировать «UTC» в качестве часового пояса в вашем операторе SQL, когда вы начали с LocalDateTime. Если вы пишете UTC, вам, вероятно, следует начинать с Instant.

person Matt Johnson-Pint    schedule 10.04.2014

Или вы можете просто использовать это

String date = mydate.ToString("u", CultureInfo.InvariantCulture);
date=date.Substring(0,date.Length-1);
person Vivek Maskara    schedule 10.04.2014