弹出日期问题 - 显示错误的日期

时间:2009-09-29 00:52:27

标签: flex date

我遇到了一个非常奇怪的Flex Date对象行为。我的Web服务是用.Net 3.5编写的,我正在检索或更新的所有对象都有.Net代码中的创建日期(日期类型)。

但是当我调用.Net Web服务并在Flex中显示数据时,Flex显示的日期与存储在Web服务中的日期不同。当我使用Flex UI更新我的对象时,每次更新时间都与.Net代码设置的实际更新时间非常不同。

任何人都可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:3)

您的日期问题可能是Flex与您的服务器之间如何处理时区和序列化的结果。我在使用Flex日期和Java方面遇到了问题,所以我将解释在那里遇到的一些事情:

  • This描述了Flex如何在没有时区信息的情况下将日期转换为UTC。
  • 您还应该了解假设.Net对日期的时区和夏令时进行了分析。我相信Java假设数据库中的日期位于服务器的时区。
  • 在调试时不要混淆我自己发现比较Flex和服务器端的UTC很有用。
  • 只需更改计算机时区,即可在本地计算机上模拟Flex的其他时区。我不知道这是否适用于.Net。
  • 最后,我使用自定义序列化将日期转换为字符串,因为从字符串构造日期比理解正在发生的隐式序列化更容易。

答案 1 :(得分:0)

我没有立即回答,但需要考虑的一些因素是:

  1. 日期不明确吗?您没有提供返回可能的样本,但是像09/10/2009这样的日期是不明确的,除非两端都同意格式(dd / mm / yyyy或mm / dd / yyy)。

  2. Flex基本上是ECMAScript的一种形式,IETF RFC 1123第5.2.14节中的格式应该正确解析。例如:

    周一,2009年9月28日21:22:00 GMT

  3. .NET中的Date对象应该能够产生(我记不起来了),Flex中的Date对象应该能够解析它。

答案 2 :(得分:0)

Flex app.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
            creationComplete="init();">
<mx:Script>
    <![CDATA[
        import mx.rpc.events.ResultEvent;

        private function init():void
        {
            updateFlexTime();
        }

        private function updateFlexTime():void
        {
            flexTimeLabel.text = new Date().toString();
            flexLocalTimeLabel.text = new Date().toLocaleString();
        }

        private function refreshHandler(event:Event):void
        {
            dateTimeService.GetCurrentDateTimeAsString();
        }

        private function onGetCurrentDateTimeAsString(event:ResultEvent):void
        {
            var value:String = String(event.result);
            var currentDate:Date = new Date(Date.parse(value));

            remoteTimeLabel.text = currentDate.toString();
            remoteLocalTimeLabel.text = currentDate.toLocaleString();

            updateFlexTime();
        }
    ]]>
</mx:Script>
<mx:Form>
    <mx:FormItem label="Flex time:">
        <mx:Text id="flexTimeLabel"/>
    </mx:FormItem>

    <mx:FormItem label="Remote time:">
        <mx:Text id="remoteTimeLabel"
                 text="Press refresh button."/>
    </mx:FormItem>

    <mx:FormItem label="Flex local time:">
        <mx:Text id="flexLocalTimeLabel"/>
    </mx:FormItem>

    <mx:FormItem label="Remote local time:">
        <mx:Text id="remoteLocalTimeLabel"
                 text="Press refresh button."/>
    </mx:FormItem>

    <mx:Button label="Refresh"
               click="refreshHandler(event)"/>
</mx:Form>
<mx:WebService id="dateTimeService"
               endpointURI="http://localhost:2054/TestService.asmx"
               wsdl="http://localhost:2054/TestService.asmx?wsdl">
    <mx:operation name="GetCurrentDateTimeAsString"
                  resultFormat="object"
                  result="onGetCurrentDateTimeAsString(event)"/>
</mx:WebService>

.Net WebService:

namespace Lab.StackOverflow
{
    using System;
    using System.Web.Services;

    /// <summary>
    /// Test date/time service
    /// </summary>
    [WebService(Namespace = "http://lab.stackoverflow.com/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class TestService : WebService
    {
        /// <summary>
        /// Get current date and time
        /// </summary>
        /// <returns>
        /// Return UTC date time by RFC 1123 standard. 
        /// </returns>
        [WebMethod]
        public string GetCurrentDateTimeAsString()
        {
            return string.Format("{0:r}{1:zz}", DateTime.Now, DateTime.Now);
        }
    }
}