如何在ASP.NET Core 6中获取前/下周的数字和年份

xfyts7mz  于 5个月前  发布在  .NET
关注(0)|答案(1)|浏览(90)

我在UI中有这个基于周的导航,点击左/右箭头时,我调用了一个API,并返回了上一周/年的数字和下一周/年的数字,但现在我需要在ASP.NET Core 6中处理它。所以它使用PHP和API工作得很好。下面给出了PHP代码的请求和输出。
x1c 0d1x的数据
下面的PHP代码按预期工作。但我需要在APS.NET Core 6相同的输出。

$prev_week = date ("W", strtotime ($year. 'W' . $week . ' -1 week'));
$prev_year = date ("o", strtotime ($year. 'W' . $week . ' -1 week'));
$next_week = date ("W", strtotime ($year. 'W' . $week . ' +1 week'));
$next_year = date ("o", strtotime ($year. 'W' . $week . ' +1 week'));

字符串
如果我有周52和2023年,那么这段代码的输出将是:

prev_week 51
prev_year 2023
next_week 01
next_year 2024


现在我正试图将上面的代码转换为ASP.NET Core 6,但我无法获得PHP的确切输出。
因为我已经有了年和周的数字,所以我只想得到前一周和下一周,如果是年底或一年的第一周,那么前一周和前一年应该说周为1,年应该是前一年。

using System;

int prev_week = DateTime.ParseExact($"{year}-W{week}", "yyyy-'W'w", null).AddWeeks(-1).Week;
int prev_year = DateTime.ParseExact($"{year}-W{week}", "yyyy-'W'w", null).AddWeeks(-1).Year;
int next_week = DateTime.ParseExact($"{year}-W{week}", "yyyy-'W'w", null).AddWeeks(1).Week;
int next_year = DateTime.ParseExact($"{year}-W{week}", "yyyy-'W'w", null).AddWeeks(1).Year;


这个代码没有给我同样的结果。
我想得到相同的输出,如上图所示,从php使用viewmodel在asp.net核心6 web API。

hmae6n7t

hmae6n7t1#

我建议你可以使用nodatime package,并尝试使用下面的代码:
你可以使用下面的nuget package命令来安装。
安装包NodaTime
你可以创建一个模型类:

public class WeekYearInfo
{
    public int PrevWeek { get; set; }
    public int PrevYear { get; set; }
    public int NextWeek { get; set; }
    public int NextYear { get; set; }
}

字符串
然后你可以创建一个计算方法:

public static WeekYearInfo CalculatePrevNextWeekYear(int year, int week)
   {
       LocalDate inputDate = LocalDate.FromWeekYearWeekAndDay(year, week, IsoDayOfWeek.Monday);
       LocalDate prevWeekDate = inputDate.PlusWeeks(-1);
       LocalDate nextWeekDate = inputDate.PlusWeeks(1);
       IWeekYearRule rule = WeekYearRules.Iso;

       return new WeekYearInfo
       {
           PrevWeek = rule.GetWeekOfWeekYear(prevWeekDate),
           PrevYear = rule.GetWeekYear(prevWeekDate),
           NextWeek = rule.GetWeekOfWeekYear(nextWeekDate),
           NextYear = rule.GetWeekYear(nextWeekDate)
       };
   }


最后,你可以在控制器中调用它:

public IActionResult Privacy()
    {
        int year = 2023;
        int week = 52;
        WeekYearInfo result = CalculatePrevNextWeekYear(year, week);

        return View(result);
    }


测试结果:


的数据
编辑:

public static WeekYearInfo CalculatePrevNextWeekYear(int year, int week)
    {

        DateTime firstDayOfYear = new DateTime(year, 1, 1);
        int daysOffset = DayOfWeek.Thursday - firstDayOfYear.DayOfWeek;
        DateTime firstThursday = firstDayOfYear.AddDays(daysOffset);
        var cal = CultureInfo.CurrentCulture.Calendar;
        int firstWeek = cal.GetWeekOfYear(firstThursday, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);

        DateTime targetDate = firstDayOfYear.AddDays(week * 7 - (firstWeek == 1 ? 0 : 7));
        DateTime prevWeekDate = firstDayOfYear.AddDays(-7);
        DateTime nextWeekDate = firstDayOfYear.AddDays(7);

        return new WeekYearInfo
        {
            PrevWeek = cal.GetWeekOfYear(prevWeekDate, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday),
            PrevYear = prevWeekDate.Year,
            NextWeek = cal.GetWeekOfYear(nextWeekDate, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday),
            NextYear = nextWeekDate.Year
        };
    }

相关问题