Pergunta

Estou recebendo uma data de um servidor em milissegundos desde 1-1-1970. Em seguida, uso o DateFormatter para imprimir a data da tela. No entanto, o Flex adiciona timedifference e, portanto, exibe um tempo diferente do que recebi do servidor. Corrigi isso alterando a data antes de imprimir para a tela. Mas acho que é uma solução ruim, porque o objeto de data não possui a data correta.

Alguém sabe como usar o DateFormatter para imprimir a data, ignorando o fuso horário?

Foi assim que eu fiz:

function getDateString(value:Date):String
{
    var millisecondsPerMinute:int = 1000*60;
    var newDate:Date = new Date(value.time - (millisecondsPerMinute*value.timezoneOffset));

    var dateFormatter:DateFormatter = new DateFormatter();
    dateFormatter.formatString = "EEEE DD-MM-YYYY LL:MM AA";

    return dateFormatter.format(newDate);
}
Foi útil?

Solução

Talvez haja algo que estou perdendo, mas isso parece funcionar para mim.

<?xml version="1.0"?>
<!-- formatters\FormatterDateField.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">

<!-- Declare a DateFormatter and define formatting parameters.-->
<mx:DateFormatter id="dateFormatter" 
    formatString="EEEE DD-MM-YYYY LL:NN:SS AA"/>

<mx:Label text="Millis (1220836618601 == Monday 08-09-2008 01:16:58 AM):"/>
<mx:TextInput id="dob" text="1220836618601"/>

<mx:Label text="Formatted date UTC: "/>
<mx:TextInput id="formattedDate" 
    text="" 
    editable="false"/>
<mx:Label text="Formatted date local: "/>
<mx:TextInput id="formattedDateLoc" 
    text="" 
    editable="false"/>

<!-- Format and update the date.-->
<mx:Button label="Format Input" 
    click="
        var d :Date = new Date(parseInt(dob.text));
        formattedDate.text=dateFormatter.format(d.toUTCString());
        formattedDateLoc.text=dateFormatter.format(d);
    "/>
</mx:Application>

Sugerindo que, em vez de passar o objeto Data (que depende do fuso horário) para o DateFormatter, passe na string UTC do objeto Data. Não encontrei nada que sugira que o DateFormatter faça qualquer coisa com o fuso horário; portanto, não deve haver necessidade de tentar compensar o fuso horário, especialmente quando o objeto Data já fornece um método para obter o UTC.

function getDateString(value:Date):String
{
    var dateFormatter:DateFormatter = new DateFormatter();
    dateFormatter.formatString = "EEEE DD-MM-YYYY LL:MM AA";

    return dateFormatter.format(value.toUTCString());
}

Outras dicas

No Flex Hero 4.5, você pode usar o novo Spark DateTimeFormatter:

<s:DateTimeFormatter dateTimePattern="HH':'mm':'ss" id="dateFormatterUTC" useUTC="true" />
<s:Label text="{dateFormatterUTC.format(new Date())}" />

As correções mais simples é ter o máximo de objetos possível (e as propriedades dos objetos). A solução TimeZoneoffset funciona bem, mas o conjunto de zoneoffset para muitas cidades dos EUA muda duas vezes durante o ano. A melhor regra - tudo é uma string.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top