【问题标题】:Github last commit valueGithub 上次提交值
【发布时间】:2015-04-27 03:06:25
【问题描述】:

所以 iv 一直在做一些进一步的研究、测试等,并得到了一些人的帮助。并且 iv 能够想出以下方法:

public void GithubLastCommit(string apiLink)
    {
        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Add("User-Agent",
                "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");

            using (var response = client.GetAsync(apiLink).Result)
            {
                var json = response.Content.ReadAsStringAsync().Result;

                dynamic commits = JArray.Parse(json);
                DateTime lastCommit = commits[0].commit.author.date;
                DateTime now = DateTime.Now;
                int Days = (int)((now - lastCommit).TotalDays);
                int Hours = (int)((now - lastCommit).TotalHours);
                int Minutes = (int)((now - lastCommit).TotalMinutes);
                MessageBox.Show(Hours.ToString());
                if(Hours <=24)
                {
                    MessageBox.Show(Hours.ToString() + "Hours ago");
                }
            }
        }
    }

现在,我发送的 apiLink 只是一个随机 github,我发现要在其上进行测试:https://api.github.com/repos/Homebrew/homebrew/commits 但是我似乎没有得到正确的值(在撰写本文时 1 小时前),不管我是什么将索引更改为它没有给我任何正确的值..我可能做错了什么?

【问题讨论】:

  • 你目前得到什么输出,你期望什么?我怀疑您的 JSON 解析错误,或者您的日期代码有问题。
  • 我目前正在从提供的 api 链接接收整个 json 文件,并将其解析为 JArray,我在其中选择第一个索引并浏览可用的部分以达到日期。添加的每个部分或文件都有一个特定于每个部分或文件的哈希或 SHA 代码。我要查找的主要代码是 SHA 为 47146d 的那个。等等,当查看 api 链接时,它是第一个因此提交的代码[0] 然后我试图从 commit.author.date 中检索最新的提交,我期待 1 但由于某种原因得到 11。
  • 发布您收到的内容和获得的内容。
  • 使用 (var response = client.GetAsync(apiLink).Result) { var json = response.Content.ReadAsStringAsync().Result;有了这个..它从链接的页面中检索所有文本。粘贴评论太多了,但它是一个 json 格式的文本页面。 (它是 json 中的对象数组)所以我选择了第一个索引,它采用第一个对象并让我访问它的属性。

标签: c# json http github commit


【解决方案1】:

虽然 JSON 日期没有标准,但大多数 JSON 日期都以 UTC 表示。 ISO 8601 后面的时间值末尾的“Z”表示是这样:

    "date": "2015-04-27T03:58:52Z"

这实际上是what Json.NET expects by default,尽管您可以进行其他配置。因此你需要这样做:

DateTime now = DateTime.UtcNow;

而且你的计算应该是正确的。那是因为DateTime 减法运算符does not consider whether a DateTime is in local or UTC units 只是假设它们在同一个时区Kind 即使不是。更多详情herehere

更新

github如何格式化“最新提交”时间?如果您查看homebrew 页面的 HTML 源代码,您会看到这样的时间:

       <span class="css-truncate css-truncate-target"><time datetime="2015-04-27T15:31:05Z" is="time-ago">Apr 27, 2015</time></span>

那么,"time-ago" 是什么东西?如果查看页面的 javascript,就会发现:

n.prototype.timeAgo = function () {
var e = (new Date).getTime() - this.date.getTime(),
t = Math.round(e / 1000),
n = Math.round(t / 60),
r = Math.round(n / 60),
i = Math.round(r / 24),
o = Math.round(i / 30),
a = Math.round(o / 12);
return 0 > e ? 'just now' : 10 > t ? 'just now' : 45 > t ? t + ' seconds ago' : 90 > t ? 'a minute ago' : 45 > n ? n + ' minutes ago' : 90 > n ? 'an hour ago' : 24 > r ? r + ' hours ago' : 36 > r ? 'a day ago' : 30 > i ? i + ' days ago' : 45 > i ? 'a month ago' : 12 > o ? o + ' months ago' : 18 > o ? 'a year ago' : a + ' years ago'
},

所以看起来,如果时差大于 36 小时但小于 30 天,它们四舍五入(可能向上)到最接近的天数。您需要复制此逻辑才能在代码中获得类似的结果。因此 3.5990 天将四舍五入为“4 天前”。

我在这里找到了相同逻辑的另一个版本:github/time-elements

【讨论】:

  • 是的,我知道它必须是这样的!由于时差,我知道必须包含某种属性,以确保它知道如何转换它或至少知道如何处理现在的价值。我会马上测试这个!
  • yup .. 与之前相比,基于上次提交值,这肯定给了我一个更接近的值,非常感谢 :)
  • 但是我也在其他几个 github 上尝试了这个,只是为了确保它确实有效而且我没有发疯:P 这是我自己的 repo 的当前邮票 2015-04-23T21:46:10Z在撰写本文时是 2015-04-27T22:09:00 但是当我使用上面的 DateTime.UtcNow;它在几天内给了我.. 3.5990 ... github 说最后一次提交是在 4 天.. 因为在撰写本文时已经过去 4 天,它不应该更接近 4.0547.. 或类似的东西吗?我做错了吗?
  • @Darkshadow - 答案已更新。如果还是有问题,可以edit your question告诉我如何重现问题吗?例如,你能给我一个有问题的 JSON 样本吗?另外,ISO 8601 format 你电脑上的时间是几点?
  • 我刚刚意识到,当我在玩耍并更新到 git 和所有内容并查看 json 响应时,时间戳是不同的,这让我想到了它使用的时区,所以我认为对它产生了奇怪的影响。但是,是的,我得出了相同的结论,他们四舍五入..因此我意识到我可以使用我的问题中的代码并简单地将其四舍五入:P 现在它至少是半准确的:P 我感谢您的所有帮助: ) 它肯定帮助我更好地理解和理解它:) 我在 ISO 8601 格式中的时间是:2015-04-28T03:13:05Z atm
猜你喜欢
  • 2011-12-10
  • 2021-12-26
  • 1970-01-01
  • 2017-06-11
  • 2021-12-18
  • 2011-06-14
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多