我遇到了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获取格式化字符串,但我想找出此问题的根本原因并尝试解决它。
我希望我已经清楚地解释了这个问题,并希望对此有所了解。
提前致谢, 干杯
答案 0 :(得分:0)
这不是Crystal Report的问题;这是一个数据集问题。
文章解释说,如果存储数据的时区和使用它们的位置不同,则可能会遇到此问题。
您可以尝试多种解决方法(即删除时间部分并为每个日期添加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)