You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:03:51