Crystal Report DateTime字段显示的日期少于它应该的一天

时间:2013-12-11 06:58:04

标签: .net datetime crystal-reports timezone dataset

我遇到了Crystal Reports DateTime的问题。当它在澳大利亚服务器(操作系统:Windows Server 2003 R2)上托管时,它会在报告上显示一天。但如果它在当地居住(在斯里兰卡)(OS:Win 7),它可以正常工作。

相关的DataSet返回正确的日期但是时间部分为ex: “11/08/2013 12:00 A.M”,在这种情况下,如果报告在澳大利亚服务器上,它将显示“10AUG2013”​​,如果在斯里兰卡托管,则显示“11AUG2013”​​。

我确实尝试过使用公式字段并将它们格式化以忽略时间部分ex:CDate(),ToText(),...等但是它在澳大利亚服务器上认为-1日期是出于某种未知原因:)

一种解决方法是使用DataSet获取格式化字符串,但我想找出此问题的根本原因并尝试解决它。

我希望我已经清楚地解释了这个问题,并希望对此有所了解。

提前致谢, 干杯

3 个答案:

答案 0 :(得分:0)

这不是Crystal Report的问题;这是一个数据集问题。

Remoted DateTime values in a DataSet object are converted to the equivalent local time of a remote computer that is in a different time zone

文章解释说,如果存储数据的时区和使用它们的位置不同,则可能会遇到此问题。

您可以尝试多种解决方法(即删除时间部分并为每个日期添加1天)但最佳解决方案是为两个服务器设置相同的时区(时区不必是服务器IS的位置)但应该是USERS的地方!)

答案 1 :(得分:0)

您可能想要使用ShiftDatetime功能。

// shift from India Standard Time (IST) to Australian Eastern Standard Time (AEST)
// IST doesn't have a daylight time; omitted
// daylight time support added for AEST
ShiftDateTime({table.date_time}, "IST,330", "AEDT,600,AEDT,60")

答案 2 :(得分:0)

最初使用水晶报告的ShiftDateTime功能对我有用,直到我发现英国环境存在一些问题,因为它们接近GMT。后来我对此进行了进一步调查,而Emanuelle是对的,这是由于数据集问题。 问题的根本原因是,它在序列化数据集时添加了时间偏移。默认情况下,dataset datetime字段的DateTimeMode为“UnspecifiedLocal”,用于创建偏移量。我只需将其更改为“未指定”以避免使用偏移量进行序列化。

前:

foreach DataTable dtbl in dataset.Tables)

            {
                foreach (DataColumn col in dtbl.Columns)
                {
                    if (col.DataType == System.Type.GetType("System.DateTime"))
                    {
                        col.DateTimeMode = DataSetDateTime.Unspecified;
                    }
                }
            }`

(参考:http://msdn.microsoft.com/en-us/library/system.data.datasetdatetime(v=vs.100).aspx