【问题标题】:Convert Int to date C#将 Int 转换为日期 C#
【发布时间】:2022-10-05 15:54:52
【问题描述】:

我觉得这应该很容易,但我很难弄清楚。我从 API 获取一个日期的整数。 Json 提供了类似“20210307”的日期属性。对我来说,将这个日期转换为 yyyy/mm/dd 格式的最佳方法是什么,并且有没有办法也可以翻转(也许是去年?)。我一直在尝试在课堂上提出一种方法,但只是遇到了问题,这让我觉得我完全不在了。谢谢!

    List<CovidDataModel> coviddata;
    string errorString;

    protected override async Task OnInitializedAsync()
    {
        var request = new HttpRequestMessage(HttpMethod.Get, \"https://api.covidtracking.com/v1/states/daily.json\");

        var client = _clientFactory.CreateClient();

        HttpResponseMessage response = await client.SendAsync(request);

        if (response.IsSuccessStatusCode)
        {
            coviddata = await response.Content.ReadFromJsonAsync<List<CovidDataModel>>();
            errorString = null;
        }
        else
        {
            errorString = $\"Could not load Covid Data: {response.ReasonPhrase}\";
        }
    }

部分模型如下:

public class CovidDataModel
    {
        public int date { get; set; }
    }

标签: c# datetime integer blazor


【解决方案1】:

假设您的日期整数是 yyyymmdd 格式:

int date = 20210307;

int year = date / 10_000;
int month = (date - year * 10_000) / 100; 
int day = date % 100;

DateTime dateTime = new DateTime(year, month, day);

拥有DateTime 后,您可以使用正常的日期格式将其格式化为您喜欢的格式。

(您也可以通过将整数转换为字符串然后解析它来做到这一点,但显然效率要低得多 - 这可能并不重要......)

【讨论】:

  • int month = date % 10_000 / 100; 是一个替代公式
【解决方案2】:

您可以使用 DateTime.ParseExact 解析自定义日期格式。只需根据您收到的 int 日期响应切换“yyyyMMdd”。

int date = 20210307;

var dateTime = DateTime.ParseExact(
    date.ToString(), 
    "yyyyMMdd", 
    CultureInfo.InvariantCulture);

Console.WriteLine(dateTime);

输出:

7/3/2021 12:00:00 AM

编辑: 附加答案

我相信您之所以说“它在显示数据时有效”是因为有时请求会挂起。

  • 更新您的请求方法,如下面的代码所示。
  • 使用可为空的类型 int 和 DateTime 在 CovidDataModel 类中,因为某些值 在 json 数据中以 null 的形式返回,当 deserializing。

我改进了你的代码

@page "/"
@using System.Text.Json
@using System.Globalization
@using System.Text.Json.Serialization;
@inject IHttpClientFactory _clientFactory

<PageTitle>Index</PageTitle>

<h1>Covid Data</h1>

@if (coviddata is null)
{
    <div class="d-flex justify-content-center mb-3">
        <p>Loading covid data...</p>
    </div>

    <div class="d-flex justify-content-center">
        <div class="spinner-border" role="status"></div>
    </div>
}
else
{
    <table class="table">
        <thead>
            <tr>
                <th scope="col" width="50">#</th>
                <th scope="col" width="100">Date</th>
                <th scope="col" width="100">state</th>
                <th scope="col" width="100">positive</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var data in coviddata)
            {
                <tr>
                    <th scope="row">@(coviddata.IndexOf(data)+1)</th>
                    <td>@ConvertIntToDate(data.date.Value, "yyyyMMdd").ToString("dd/MM/yyyy")</td>
                    <td>@data.state</td>
                    <td>@data.positive</td>
                </tr>
            }
        </tbody>
    </table>
    
}

@code{
    List<CovidDataModel> coviddata;
    string errorString;

    protected override void OnInitialized()
    {
        GetCovidData();
    }

    private async Task GetCovidData()
    {
        var options = new JsonSerializerOptions
        {
            DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault
        };

        var client = _clientFactory.CreateClient();

        using (var response = await client.GetAsync("https://api.covidtracking.com/v1/states/daily.json", 
            HttpCompletionOption.ResponseHeadersRead))
        {
            if (response.IsSuccessStatusCode)
                coviddata = await response.Content.ReadFromJsonAsync<List<CovidDataModel>>(options);
            else
                errorString = $"Could not load Covid Data: {response.ReasonPhrase}";
        }

        StateHasChanged();
    }

    private DateTime ConvertIntToDate(int date, string format)
    {
        return DateTime.ParseExact(
            date.ToString(),
            format,
            CultureInfo.InvariantCulture);
    }

    public class CovidDataModel
    {

        public int? date { get; set; }
        public string state { get; set; }
        public int? positive { get; set; }
        public int? probableCases { get; set; }
        public int? negative { get; set; }
        public object pending { get; set; }
        public string totalTestResultsSource { get; set; }
        public int? totalTestResults { get; set; }
        public int? hospitalizedCurrently { get; set; }
        public int? hospitalizedCumulative { get; set; }
        public int? inIcuCurrently { get; set; }
        public int? inIcuCumulative { get; set; }
        public object onVentilatorCurrently { get; set; }
        public object onVentilatorCumulative { get; set; }
        public int? recovered { get; set; }
        public string lastUpdateEt { get; set; }
        public DateTime? dateModified { get; set; }
        public string checkTimeEt { get; set; }
        public int? death { get; set; }
        public int? hospitalized { get; set; }
        public object hospitalizedDischarged { get; set; }
        public DateTime? dateChecked { get; set; }
        public object totalTestsViral { get; set; }
        public object positiveTestsViral { get; set; }
        public object negativeTestsViral { get; set; }
        public int? positiveCasesViral { get; set; }
        public int? deathConfirmed { get; set; }
        public int? deathProbable { get; set; }
        public int? totalTestEncountersViral { get; set; }
        public int? totalTestsPeopleViral { get; set; }
        public object totalTestsAntibody { get; set; }
        public object positiveTestsAntibody { get; set; }
        public object negativeTestsAntibody { get; set; }
        public object totalTestsPeopleAntibody { get; set; }
        public object positiveTestsPeopleAntibody { get; set; }
        public object negativeTestsPeopleAntibody { get; set; }
        public object totalTestsPeopleAntigen { get; set; }
        public object positiveTestsPeopleAntigen { get; set; }
        public int? totalTestsAntigen { get; set; }
        public object positiveTestsAntigen { get; set; }
        public string fips { get; set; }
        public int? positiveIncrease { get; set; }
        public int? negativeIncrease { get; set; }
        public int? total { get; set; }
        public int? totalTestResultsIncrease { get; set; }
        public int? posNeg { get; set; }
        public object dataQualityGrade { get; set; }
        public int? deathIncrease { get; set; }
        public int? hospitalizedIncrease { get; set; }
        public string hash { get; set; }
        public int? commercialScore { get; set; }
        public int? negativeRegularScore { get; set; }
        public int? negativeScore { get; set; }
        public int? positiveScore { get; set; }
        public int? score { get; set; }
        public string grade { get; set; }
    }
}

输出:

【讨论】:

  • 谢谢!这是我的回答。我只是在努力实现它,以便在显示数据时它可以工作。
  • @NT360 你能进一步澄清这个问题吗?
【解决方案3】:

您不需要将字符串解析为 int。如果您已经将它作为字符串接收,则可以使用 DateTime.TryParseExact() 像这样解析它:

using System;
using System.Globalization;
                    
public class Program
{
    public static void Main()
    {
        var myDate = "20220901";
        
        DateTime result;        
        DateTime.TryParseExact(myDate, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out result);
        
        var newDateFormat = result.ToString("yyyy/MM/dd");
        
        Console.WriteLine(newDateFormat);
    }
}

这会给你:“2022/09/01”

您可以通过指定格式字符串来“翻转”:

//put year last (Day/Month/Year):
var newDateFormat = result.ToString("dd/MM/yyyy");

这将为您提供:“01/09/2022”

【讨论】:

    【解决方案4】:
    int sampleDate = 20210307;
    var dateFormat = DateTime.ParseExact(sampleDate.ToString(), "yyyyMMdd",
             CultureInfo.InvariantCulture).ToString("yyyy/MM/dd");
    

    结果:

    “2021/03/07”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 2020-10-03
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多