如何通过.NET API获取TFS用户时区,解决提交日期范围查询问题
碰到这两个TFS的问题确实挺挠头的,我来一步步帮你解决:
问题1:ID范围查询提交记录的排序问题
你提到用ID范围查询返回的是按字母排序的提交,这其实是正常的——因为Git提交ID是哈希字符串,字母排序和提交的创建时间完全不相关,所以靠ID范围根本筛选不出指定日期的提交。
正确的做法是直接用GitQueryCommitsCriteria的FromDate和ToDate参数来限定日期范围,完全不需要依赖ID范围。这样查询出来的提交会默认按创建时间排序(你也可以显式设置Order属性来确认排序规则)。
问题2:获取用户时区的.NET API方案
你说知道对应的REST API但找不到.NET实现,其实在Azure DevOps的.NET SDK(TFS也适用)里,已经封装了获取用户偏好设置的方法,其中就包含时区信息。
具体来说,你可以通过CoreHttpClient的GetUserPreferencesAsync()方法拿到当前用户的所有偏好设置,里面的TimeZone属性就是用户在个人资料->区域设置->时区里配置的值。
给你一段示例代码参考:
using Microsoft.TeamFoundation.Core.WebApi; using Microsoft.VisualStudio.Services.WebApi; using System; using System.Threading.Tasks; public async Task<TimeZoneInfo> GetUserTimeZoneAsync(Uri tfsServerUri, VssCredentials credentials) { using var connection = new VssConnection(tfsServerUri, credentials); var coreClient = connection.GetClient<CoreHttpClient>(); // 获取用户偏好设置,包含时区ID var userPreferences = await coreClient.GetUserPreferencesAsync(); if (string.IsNullOrEmpty(userPreferences.TimeZone)) { // 如果用户没设置时区,可返回服务器默认或UTC return TimeZoneInfo.Utc; } // 转换为时区对象 return TimeZoneInfo.FindSystemTimeZoneById(userPreferences.TimeZone); }
拿到时区对象后,你就可以把GitCommitRef.Committer.Date的UTC时间转换成用户时区的本地时间,再格式化成GitQueryCommitsCriteria.FromDate需要的格式:
var utcCommitDate = commit.Committer.Date; var userTimeZone = await GetUserTimeZoneAsync(tfsUri, credentials); var userLocalDate = TimeZoneInfo.ConvertTimeFromUtc(utcCommitDate, userTimeZone); // 构造查询条件 var criteria = new GitQueryCommitsCriteria { FromDate = userLocalDate.ToString("yyyy-MM-ddTHH:mm:ss"), // 可根据TFS要求调整格式 // 其他参数... };
这样就能保证传入的日期和用户设置的时区一致,查询结果也会符合预期。
内容的提问来源于stack exchange,提问作者Manikanta Cv
相关产品推荐
相关产品推荐

