C# 使用Linq将数据字符串转换为时间

C# 使用Linq将数据字符串转换为时间,c#,asp.net,linq,C#,Asp.net,Linq,知道这些值是分钟数,我如何将以下内容转换为时间 350-6591640-21192880-3479 The output id like is M 5:50am - 10:59am T 3:20am - 10:59am W 12:00am - 9:59am etc.... Ranges - Mon= 0-1439 Tue = 1440-2879 Wed = 2880 - 4319 Thurs = 4321 - 5759 Fri = 5760 - 71

知道这些值是分钟数,我如何将以下内容转换为时间

350-6591640-21192880-3479

The output id like is 
M 5:50am - 10:59am
T 3:20am - 10:59am
W 12:00am - 9:59am
etc....

Ranges - 
    Mon= 0-1439
    Tue = 1440-2879
    Wed = 2880 - 4319
    Thurs = 4321 - 5759
    Fri = 5760 - 7199
    Sat = 7200 - 8639
    Sun = 8640 - 10079
到目前为止,我得到的是

var days = new[] { 24, 48, 72, 96, 120, 144, 168 };
var numbers = Enumerable.Range(1,7);
var hours = days.ToDictionary(x => (double)x/24, i => (int)I*60);

which outputs 
Key     Value
1       1440 
2       2880
3       4320   
4       5760
5       7200 
6       8640
7      10080

您可以获取一周中当前的星期一并添加分钟数。我不认为你能直接在林克做到这一点

//your timestamp
int minutes = 2345;

//get the day of week (sunday = 0)
int weekday = (int)DateTime.Now.DayOfWeek - 1;
if (DateTime.Now.DayOfWeek == DayOfWeek.Sunday)
    weekday = 6;

//get the first day of this week
DateTime firstDayOfWeek = DateTime.Now.AddDays(-1 * weekday);

//add the number of minutes
DateTime date = firstDayOfWeek.Date.AddMinutes(minutes);

与绝对时间点相对的时间间隔表示为。在这种情况下,一个时间跨度表示从一周开始到开始时间的偏移量,然后另一个时间跨度表示到结束时间的偏移量

下面介绍如何将字符串转换为一系列时间跨度

var input = @"540-1019;1980-2459;3420-3899;4860-5339;6300-6779";
var times = input
    .Split(';')
    .Select(item => item.Split('-'))
    .Select(pair => new
    {
        StartTime = new TimeSpan(hours: 0, minutes: int.Parse(pair[0]), seconds: 0),
        EndTime   = new TimeSpan(hours: 0, minutes: int.Parse(pair[1]), seconds: 0)
    })
    .ToList();
foreach (var time in times)
{
    Console.WriteLine
    (
        @"Day: {0} Start: {1:h\:mm} End: {2:h\:mm}",
        time.StartTime.Days, 
        time.StartTime,
        time.EndTime
    );
}
输出:

Day: 0 Start: 9:00 End: 16:59
Day: 1 Start: 9:00 End: 16:59
Day: 2 Start: 9:00 End: 16:59
Day: 3 Start: 9:00 End: 16:59
Day: 4 Start: 9:00 End: 16:59

当然,您可以选择使用适当的格式字符串以任何方式设置时间跨度的格式。

我一点也不明白这个问题,但将您所说的一切都视为表面价值:

var times = "350-659, 1640-2119, 2880-3479;"
  .Split(',')                                                     //split to string pairs like "350-659"
  .Select(s => s.Split('-').Select(x => int.Parse(x)).ToArray())  //split stringpairs to two strings like "350" and "659", then parse to ints and store as an array
  .Select(sa =>  new {                                            //turn array ints into dates
        F = new DateTime(0).AddMinutes(sa[0]),                    //date 0 i.e. jan 1 0001 was a monday. add minutes to it to get a time and day
        T = new DateTime(0).AddMinutes(sa[1] + 1)                 //add 1 to the end minute otherwise 659 is 10:59pm and you want 11:00am
      }
  )

  .Select(t => 
      $"{($"{t.F:ddd}"[0])} {t.F:hh':'mmtt} - {t.T:hh':'mmtt}"    //format the date to a day name and pull the first character, plus format the dates to hh:mmtt format (eg 09:00AM)
  );
    
    Console.Write(string.Join("\r\n", times));
如果你真的想以一种合理的方式处理这些事情,我建议你在最后一个Select之前停止,它将它们字符串化,然后处理包含一对datetime的匿名类型t

这个输出唯一不符合规范的地方是AM/PM是大写的。如果这让你感到困扰,请考虑:

$"{t.F:ddd}"[0] + ($" {t.F:hh':'mmtt} - {t.T:hh':'mmtt}").ToLower()

反向工作,编写一个函数来完成您想要的解析任务。然后编写一个函数,从源输入中枚举令牌。然后编写将标记传递给解析函数的代码。然后检查如何将该代码(很可能是foreach循环)转换为linq投影。换句话说,把任务分成几个步骤,每个步骤都要单独完成。我想不久前有人认为这样做是个好主意。我想你还需要知道今天是星期几。而且,你的映射是不正确的。1440年是星期二00:00,其余时间也一样。将以下时间转换为时间-时间何时?在C语言中,没有任何时间是没有日期的。好的,那么540是周一的上午9点,但是你希望它是哪一年的哪一周?一天一封信就够了。有两个T和两个Ss。似乎您正在不断地提出需求。谢谢,如果您不介意我问一下,您在select语句中使用了哪种表达式,以及$,我对linq还是新手这不是linq,而是字符串插值。var x=你好;var y=${x}世界;是写var x=Hello的更简洁的方式;var y=string.Format{0}world,x;尽管您不能重用string.Format中的参数;如果你想在一个插值字符串中写两次东西,你必须写两次,比如vary=${i<1?hello:bye}{i<1?hello:bye}在你看来,这个世界可能没有vary=string那么整洁。Format{0}{0}world,i<1?您好:再见。如果插值最简单的方法是生成变量:var helloOrGoodbye=i<1?你好:再见;变量y=${helloOrGoodbye}{helloOrGoodbye}世界。与string.Format一样,占位符可以接受冒号后面的格式字符串,因此var i=255;var y=$Hex is:{i:X}将255格式化为十六进制字符串,与调用i.ToStringX或string相同。FormatHex is:{0:X},i;wouldI添加了一些注释来解释linq