在Borland Starteam服务器中计算客户端 - 服务器时间差异8
问题。我需要一种通过Starteam Java SDK 8.0查找Starteam服务器时间的方法。服务器的版本是8.0.172,所以方法Server.getCurrentTime()
不可用,因为它仅在服务器版本9.0中添加。在Borland Starteam服务器中计算客户端 - 服务器时间差异8
动机。我的应用程序需要在特定日期使用视图。因此,如果客户端(应用程序运行的地方)和服务器之间的系统时间有所不同,那么获得的视图并不准确。在最糟糕的情况下,客户端的请求日期将在服务器上运行,因此操作会导致异常。
经过一番调查后,我还没有找到比使用临时物品更清洁的解决方案。我的应用请求该项目的创建时间并将其与本地时间进行比较。下面是我用它来获得服务器时间的方法:
public Date getCurrentServerTime() {
Folder rootFolder = project.getDefaultView().getRootFolder();
Topic newItem = (Topic) Item.createItem(project.getTypeNames().TOPIC, rootFolder);
newItem.update();
newItem.remove();
newItem.update();
return newItem.getCreatedTime().createDate();
}
<stab_in_the_dark>
我不熟悉的SDK,但是从看API如果服务器是一个已知的时区,为什么不能创建和OLEDate对象,其日期将是客户端的时间揉捻适当地根据服务器的时区? </stab_in_the_dark>
如果StarTeam服务器是在Windows中,你的代码将在Windows中被执行,你可以掏出并执行NET时间命令在该机器上获取时间,然后将其与当地时间进行比较。
net time \\my_starteam_server_machine_name
应返回:
"Current time at \\my_starteam_server_machine_name is 10/28/2008 2:19 PM"
"The command completed successfully."
好吧,我的StarTeam服务器在Unix机器上。但即使它在Windows上运行,我也不想绑定到特定的平台。无论如何,你的回答给出了另一种可能的解决方案谢谢。 – wheleph 2008-10-28 21:00:27
我们需要拿出寻找与CodeCollab使用服务器时间的方法。这里是一个(很长的)C#代码示例,介绍如何在不创建临时文件的情况下执行此操作。分辨率是1秒。
static void Main(string[] args)
{
// ServerTime replacement for pre-2006 StarTeam servers.
// Picks a date in the future.
// Gets a view, sets the configuration to the date, and tries to get a property from the root folder.
// If it cannot retrieve the property, the date is too far in the future. Roll back the date to an earlier time.
DateTime StartTime = DateTime.Now;
Server s = new Server("serverAddress", 49201);
s.LogOn("User", "Password");
// Getting a view - doesn't matter which, as long as it is not deleted.
Project p = s.Projects[0];
View v = p.AccessibleViews[0]; // AccessibleViews saves checking permissions.
// Timestep to use when searching. One hour is fairly quick for resolution.
TimeSpan deltaTime = new TimeSpan(1, 0, 0);
deltaTime = new TimeSpan(24 * 365, 0, 0);
// Invalid calls return faster - start a ways in the future.
TimeSpan offset = new TimeSpan(24, 0, 0);
// Times before the view was created are invalid.
DateTime minTime = v.CreatedTime;
DateTime localTime = DateTime.Now;
if (localTime < minTime)
{
System.Console.WriteLine("Current time is older than view creation time: " + minTime);
// If the dates are so dissimilar that the current date is before the creation date,
// it is probably a good idea to use a bigger delta.
deltaTime = new TimeSpan(24 * 365, 0, 0);
// Set the offset to the minimum time and work up from there.
offset = minTime - localTime;
}
// Storage for calculated date.
DateTime testTime;
// Larger divisors converge quicker, but might take longer depending on offset.
const float stepDivisor = 10.0f;
bool foundValid = false;
while (true)
{
localTime = DateTime.Now;
testTime = localTime.Add(offset);
ViewConfiguration vc = ViewConfiguration.CreateFromTime(testTime);
View tempView = new View(v, vc);
System.Console.Write("Testing " + testTime + " (Offset " + (int)offset.TotalSeconds + ") (Delta " + deltaTime.TotalSeconds + "): ");
// Unfortunately, there is no isValid operation. Attempting to
// read a property from an invalid date configuration will
// throw an exception.
// An alternate to this would be proferred.
bool valid = true;
try
{
string testname = tempView.RootFolder.Name;
}
catch (ServerException)
{
System.Console.WriteLine(" InValid");
valid = false;
}
if (valid)
{
System.Console.WriteLine(" Valid");
// If the last check was invalid, the current check is valid, and
// If the change is this small, the time is very close to the server time.
if (foundValid == false && deltaTime.TotalSeconds <= 1)
{
break;
}
foundValid = true;
offset = offset.Add(deltaTime);
}
else
{
offset = offset.Subtract(deltaTime);
// Once a valid time is found, start reducing the timestep.
if (foundValid)
{
foundValid = false;
deltaTime = new TimeSpan(0,0,Math.Max((int)(deltaTime.TotalSeconds/stepDivisor), 1));
}
}
}
System.Console.WriteLine("Run time: " + (DateTime.Now - StartTime).TotalSeconds + " seconds.");
System.Console.WriteLine("The local time is " + localTime);
System.Console.WriteLine("The server time is " + testTime);
System.Console.WriteLine("The server time is offset from the local time by " + offset.TotalSeconds + " seconds.");
}
输出:
Testing 4/9/2009 3:05:40 PM (Offset 86400) (Delta 31536000): InValid
Testing 4/9/2008 3:05:40 PM (Offset -31449600) (Delta 31536000): Valid
...
Testing 4/8/2009 10:05:41 PM (Offset 25200) (Delta 3): InValid
Testing 4/8/2009 10:05:38 PM (Offset 25197) (Delta 1): Valid
Run time: 9.0933426 seconds.
The local time is 4/8/2009 3:05:41 PM
The server time is 4/8/2009 10:05:38 PM
The server time is offset from the local time by 25197 seconds.
这不是关于时区。现实世界中的服务器和客户端的系统时钟可能不会同步,我的应用需要计算时间偏移以正确运行。 – wheleph 2008-09-24 12:32:43