https://fullcalendar.io/ select event salva hora de início usando código da resposta Como passar tstzrange para postgres
Javascript:
document.addEventListener('DOMContentLoaded', function() {
const calOpts = {
locale: 'ee',
slotDuration: '00:15:00',
slotLabelInterval: '00:15',
allDaySlot: false,
selectConstraint: 'businessHours',
select : function( selectionInfo ) {
document.getElementById('start').value = selectionInfo.start
},
selectable: true,
events: { url: 'api/fullcalendar' }
}
const calendarEl = document.getElementById('calendar')
calendar = new FullCalendar.Calendar(calendarEl, calOpts)
calendar.render()
})
html:
<form action="~/kinnitatud" method="post">
<input type="hidden" name="start" id="start" />
<input type='submit'/>
</form>
selectionInfo.start contém valor localizado como
Segunda-feira, 30 de dezembro de 2024, 09:30:00 GMT + 0200 (padrão Ida-Euroopa, por exemplo)
O controlador .NET 9 MVC analisa-o usando
[HttpPost]
public async Task<IActionResult> Kinnitatud(string start) {
DateTime algus = DateTimeOffset.Parse(start,new CultureInfo("ee")).UtcDateTime;
}
DateTimeOffset.Parse lança exceção:
String 'Mon Dec 30 2024 09:30:00 GMT+0200 (Ida-Euroopa standardaeg)' was not recognized as a valid DateTime.
Tentei também sem
localidade: 'ee',
configuração, mas o valor inicial ainda está na cultura ee. ee é cultura do navegador. Fullcalendar retorna selectionInfo.start no formato de cultura do navegador sempre.
Tentei usar DateTime.Parse no controlador:
DateTime algus = DateTime.Parse(start, new CultureInfo("ee")).ToUniversalTime()
A exceção é a mesma.
Como forçar fullcalendar a retornar o horário de início selecionado no formato de cultura invariável?
Ou: usuários têm culturas diferentes no navegador. Como analisar start selectionInfo.start retornado por fullcalendar?
Você disse isso
...mas isso não é verdade. Fullcalendar - conforme a documentação - retorna um
DateTime
objeto JavaScript noselectionInfo.start
campo. Esse é um objeto , com propriedades. Não é uma string pré-formatada.O que acontece então é que, quando você usa
document.getElementById('start').value = selectionInfo.start
para escrever esse valor no seustart
campo oculto, o JS tem que transformar o objeto de data em um pedaço de texto. E como você não especificou nenhum outro formato para a data stringificada, ele usa a função toString padrão da classe DateTime. É isso que produz oMon Dec 30 2024 09:30:00 GMT+0200 (Ida-Euroopa standardaeg)
tipo de string que você está vendo. Não tem nada a ver com fullCalendar, depende inteiramente da maneira como você escreveu seu código.Uma maneira muito melhor de transmitir uma data, em um formato mais analisável e sem nenhuma bagagem de localização, é usar o formato padrão ISO8601 (por exemplo,
YYYY-MM-DDTHH:mm:ss.sssZ
). E o objeto Datetime do JavaScript tem uma função que gera a data nesse formato exato .Então tudo o que você precisa fazer é escrever
em vez de.
Então seu código .NET deve ser capaz de analisar a data sem problemas. Não posso testar agora, mas você pode até conseguir escrever
como assinatura do método e evite a chamada manual para
DateTimeOffset.Parse()
.