GoLang: конвертировать DD-MON-YY String в Date [duplicate]

Чтобы привязываться к модели на обратной стороне, атрибуты name элементов управления формы должны соответствовать свойствам модели. Использование цикла foreach не создает правильные атрибуты имени. Если вы проверите html, вы увидите несколько экземпляров

<input type="text" name="item.LeaveType" .../>

, но для привязки к вашей модели элементы управления должны быть

<input type="text" name="LeaveDetailsList[0].LeaveType" .../>
<input type="text" name="LeaveDetailsList[1].LeaveType" .../>

и т. Д. Самый простой способ подумать об этом - рассмотреть вопрос о том, как вы получите доступ к значению свойства LeaveType в коде C#

var model = new LeaveBalanceViewModel();
// add some LeaveBalanceDetails instances to the LeaveDetailsList property, then access a value
var leaveType = model.LeaveDetailsList[0].LeaveType;

. Поскольку ваш метод POST будет иметь имя параметра (скажем, model), просто снимите префикс (model), и именно так должен быть атрибут имени элемента управления. Для этого вы должны использовать либо цикл for (сбор должен реализовывать IList<T>)

for(int i = 0; i < Model.LeaveDetailsList.Count; i++)
{
    @Html.TextBoxFor(m => m.LeaveDetailsList[i].LeaveType)
    ....
}

, либо использовать пользовательский EditorTemplate (в коллекции необходимо реализовать только IEnumerable<T>)

В /Views/Shared/EditorTemplates/LeaveBalanceDetails.cshtml

@model yourAssembly.LeaveBalanceDetails
<tr>
    <td>@Html.TextBoxFor(m => m.LeaveType)</td>
    ....
</tr>

, а затем в основном представлении (не в цикле)

<table>
    .... // add headings (preferably in a thead element
    <tbody>
        @Html.EditorFor(m => m.LeaveDetailsList)
    </tbody>
</table>

и, наконец, в контроллере

public ActionResult Edit(LeaveBalanceViewModel model)
{
    // iterate over model.LeaveDetailsList and save the items
}
61
задан kannanrbk 15 September 2014 в 10:47
поделиться

6 ответов

Используемый макет действительно «2006-01-02T15:04:05.000Z», описанный в RickyA answer . Это не «время первого совершения перехода», а скорее мнемонический способ запомнить этот макет. См. pkg / time :

Контрольное время, используемое в макетах:

Mon Jan 2 15:04:05 MST 2006

, которое Время Unix 1136239445. Поскольку MST является GMT-0700, начало отсчета времени можно рассматривать как

 01/02 03:04:05PM '06 -0700

(1,2,3,4,5,6,7, если вы помните, что 1 является за месяц и 2 за день, что нелегко для такого европейца, как я, использовалось для формата даты в день)

Как показано в « time.parse: почему голанг ", что макет (с использованием 1,2,3,4,5,6,7) должен соблюдаться точно .

55
ответ дан Community 26 August 2018 в 02:35
поделиться

Это довольно поздно для вечеринки, и на самом деле ничего не сказано о том, что еще не было сказано в той или иной форме, в основном по ссылкам выше, но я хотел дать TL, DR recap тем, у кого меньше внимания :

Дата и время строки формата go очень важны. Это то, как Go знает, какое поле есть. Они обычно равны 1-9 слева направо, следующим образом:

  • Январь / Янв / январь / jan / 01 / _1 (и т. Д.) Указаны в течение месяца
  • 02 / _2 для дня месяца
  • 15/03 / _3 / PM / P / pm / p для часа и amp; Меридиан (3 часа)
  • 04 / _4 находится в течение минут
  • 05 / _5 в секундах
  • 2006/06 за год
  • -0700 / 07:00 / MST для часового пояса
  • .999999999 / .000000000 и т. Д. Для частичных секунд (я думаю, что различие заключается в том, что конечные нули удалены)
  • Mon / Monday это день недели (на самом деле был 01-02-2006),

Итак, не записывайте «01-05-15» в качестве формата даты, если вы не хотите «Месяц» «Второй час»

(... опять же, это было в основном резюме выше.)

0
ответ дан Loren Osborn 26 August 2018 в 02:35
поделиться

Я предлагаю использовать time.RFC3339 константу из временного пакета. Вы можете проверить другие константы из временного пакета. https://golang.org/pkg/time/#pkg-constants

package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println("Time parsing");
    dateString := "2014-11-12T11:45:26.371Z"
    time1, err := time.Parse(time.RFC3339,dateString);
    if err!=nil {
    fmt.Println("Error while parsing date :", err);
    }
    fmt.Println(time1); 
}
6
ответ дан Nishant Rawat 26 August 2018 в 02:35
поделиться

Здесь указаны точные номера макетов, описанные здесь здесь , и хороший блогпост здесь .

так:

layout := "2006-01-02T15:04:05.000Z"
str := "2014-11-12T11:45:26.371Z"
t, err := time.Parse(layout, str)

if err != nil {
    fmt.Println(err)
}
fmt.Println(t)

дает :

>> 2014-11-12 11:45:26.371 +0000 UTC

Я знаю. Умение ошеломляет. Также поймал меня в первый раз. Go просто не использует абстрактный синтаксис для компонентов datetime (YYYY-MM-DD), но эти точные числа (я думаю, что время первой фиксации go Nope, согласно этому . Кто-нибудь знает? ).

82
ответ дан RickyA 26 August 2018 в 02:35
поделиться

Как ответ, но чтобы сохранить ввод "2006-01-02T15:04:05.000Z" для макета, вы можете использовать константу пакета RFC3339 .

str := "2014-11-12T11:45:26.371Z"
t, err := time.Parse(time.RFC3339, str)

if err != nil {
    fmt.Println(err)
}
fmt.Println(t)

https: // play .golang.org / р / Dgu2ZvHwTh

21
ответ дан robstarbuck 26 August 2018 в 02:35
поделиться

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

Я пробовал искать библиотеки, и я нашел это:

https://github.com/araddon/dateparse

Пример из README:

package main

import (
    "flag"
    "fmt"
    "time"

    "github.com/apcera/termtables"
    "github.com/araddon/dateparse"
)

var examples = []string{
    "May 8, 2009 5:57:51 PM",
    "Mon Jan  2 15:04:05 2006",
    "Mon Jan  2 15:04:05 MST 2006",
    "Mon Jan 02 15:04:05 -0700 2006",
    "Monday, 02-Jan-06 15:04:05 MST",
    "Mon, 02 Jan 2006 15:04:05 MST",
    "Tue, 11 Jul 2017 16:28:13 +0200 (CEST)",
    "Mon, 02 Jan 2006 15:04:05 -0700",
    "Thu, 4 Jan 2018 17:53:36 +0000",
    "Mon Aug 10 15:44:11 UTC+0100 2015",
    "Fri Jul 03 2015 18:04:07 GMT+0100 (GMT Daylight Time)",
    "12 Feb 2006, 19:17",
    "12 Feb 2006 19:17",
    "03 February 2013",
    "2013-Feb-03",
    //   mm/dd/yy
    "3/31/2014",
    "03/31/2014",
    "08/21/71",
    "8/1/71",
    "4/8/2014 22:05",
    "04/08/2014 22:05",
    "4/8/14 22:05",
    "04/2/2014 03:00:51",
    "8/8/1965 12:00:00 AM",
    "8/8/1965 01:00:01 PM",
    "8/8/1965 01:00 PM",
    "8/8/1965 1:00 PM",
    "8/8/1965 12:00 AM",
    "4/02/2014 03:00:51",
    "03/19/2012 10:11:59",
    "03/19/2012 10:11:59.3186369",
    // yyyy/mm/dd
    "2014/3/31",
    "2014/03/31",
    "2014/4/8 22:05",
    "2014/04/08 22:05",
    "2014/04/2 03:00:51",
    "2014/4/02 03:00:51",
    "2012/03/19 10:11:59",
    "2012/03/19 10:11:59.3186369",
    // Chinese
    "2014年04月08日",
    //   yyyy-mm-ddThh
    "2006-01-02T15:04:05+0000",
    "2009-08-12T22:15:09-07:00",
    "2009-08-12T22:15:09",
    "2009-08-12T22:15:09Z",
    //   yyyy-mm-dd hh:mm:ss
    "2014-04-26 17:24:37.3186369",
    "2012-08-03 18:31:59.257000000",
    "2014-04-26 17:24:37.123",
    "2013-04-01 22:43",
    "2013-04-01 22:43:22",
    "2014-12-16 06:20:00 UTC",
    "2014-12-16 06:20:00 GMT",
    "2014-04-26 05:24:37 PM",
    "2014-04-26 13:13:43 +0800",
    "2014-04-26 13:13:44 +09:00",
    "2012-08-03 18:31:59.257000000 +0000 UTC",
    "2015-09-30 18:48:56.35272715 +0000 UTC",
    "2015-02-18 00:12:00 +0000 GMT",
    "2015-02-18 00:12:00 +0000 UTC",
    "2017-07-19 03:21:51+00:00",
    "2014-04-26",
    "2014-04",
    "2014",
    "2014-05-11 08:20:13,787",
    // mm.dd.yy
    "3.31.2014",
    "03.31.2014",
    "08.21.71",
    //  yyyymmdd and similar
    "20140601",
    // unix seconds, ms
    "1332151919",
    "1384216367189",
}

var (
    timezone = ""
)

func main() {
    flag.StringVar(&timezone, "timezone", "UTC", "Timezone aka `America/Los_Angeles` formatted time-zone")
    flag.Parse()

    if timezone != "" {
        // NOTE:  This is very, very important to understand
        // time-parsing in go
        loc, err := time.LoadLocation(timezone)
        if err != nil {
            panic(err.Error())
        }
        time.Local = loc
    }

    table := termtables.CreateTable()

    table.AddHeaders("Input", "Parsed, and Output as %v")
    for _, dateExample := range examples {
        t, err := dateparse.ParseLocal(dateExample)
        if err != nil {
            panic(err.Error())
        }
        table.AddRow(dateExample, fmt.Sprintf("%v", t))
    }
    fmt.Println(table.Render())
}
3
ответ дан srf 26 August 2018 в 02:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: