How to make an if statement to show xml attribute based on current time

Refresh

December 2018

Views

450 time

4

I have a XML like this:

<PrayerTime
    Day ="1" 
    Month="5" 
    Fajr="07:00" 
    Sunrise="09:00"
    Zuhr="14:00"
/>

A class like this:

public class PrayerTime
{   
    public string Fajr { get; set; }
    public string Sunrise { get; set; }
    public string Zuhr { get; set; }
}

And something to get the value like this:

XDocument loadedCustomData = XDocument.Load("WimPrayerTime.xml");
var filteredData = from c in loadedCustomData.Descendants("PrayerTime")
                   where c.Attribute("Day").Value == myDay.Day.ToString()
                   && c.Attribute("Moth").Value == myDay.Month.ToString()
                   select new PrayerTime()
                   {
                       Fajr = c.Attribute("Fajr").Value,
                       Sunrise = c.Attribute("Sunrise").Value,
                   };
myTextBox.Text = filteredData.First().Fajr;

How can i based by current time of day say that if time is between the value of Fajr and the Value of Sunrise, then myTextBox should show the value of Fajr. If value of current time is between sunrise and Zuhr, show Zuhr?

How can i get it to show the attribute name in myTextBox2? For example, myTextBox shows value "07:00", and myTextBox2 shows "Fajr"?

3 answers

0

Проблема здесь ваш код «stringly напечатал». Я бы лучше использовать тип, конструкция для времени , например , DateTime , но быстро исправить это:

               // don't you need a third one here?
               select new PrayerTime()
               {
                   Fajr = c.Attribute("Fajr").Value,
                   Sunrise = c.Attribute("Sunrise").Value,
               };

Tu получить текущий час:

int currentHour = DateTime.Now.Hour;

Тогда просто простое сравнение двух целых чисел.

var data = filteredData.First();
int fajrHour = int.Parse(data.Fajr.Substring(0, 2), CultureInfo.InvariantCulture);
int sunriseHour = int.Parse(data.Sunrise.Substring(0, 2), CultureInfo.InvariantCulture);
int zuhrHour = int.Parse(data.Zuhr.Substring(0, 2), CultureInfo.InvariantCulture);

if(fajrHour <= currenHour && currenHour < sunriseHour)
{
    myTextBox.Text = data.Fajr; // or to show value fajrHour.ToString()
}
if(sunriseHour <= currenHour && currenHour  < zuhrHour)
{
    myTextBox.Text = data.Zuhr; //    zuhrHour.ToString()
}
// don't you need a third one here?
1

Во-первых изменить класс согласно @abatischcev

public class PrayerTime
{
    public TimeSpan Fajr { get; set; }
    public TimeSpan Sunrise { get; set; }
    public TimeSpan Zuhr { get; set; }
}

Затем измените запрос LINQ выберите часть, как:

select new PrayerTime()
{
    Fajr = TimeSpan.Parse(c.Attribute("Fajr").Value),
    Sunrise = TimeSpan.Parse(c.Attribute("Sunrise").Value),
    Zuhr = TimeSpan.Parse(c.Attribute("Zuhr").Value)
};

то чек должен быть:

var obj = filteredData.First();
TimeSpan currentTime = myDay.TimeOfDay;
string result = String.Empty;
if (currentTime >= obj.Fajr && currentTime < obj.Sunrise)
{
    result = "Fajar";
}
else if (currentTime >= obj.Sunrise && currentTime < obj.Zuhr)
{
    result = "Zuhar";
}
textbox1.Text = result;

(Кстати, Зухр время должно быть между Зухра и Асар :))

1

Во-первых, держать не строку, но объект TimeSpan:

public TimeSpan Fajr { get; set; }
public TimeSpan Sunrise { get; set; }

Для этого синтаксического анализа XML в DateTime:

TimeSpan ts = TimeSpan.Parse(c.Attribute("attr"));

Так:

TimeSpan now = DateTime.Now.TimeOfDay; // time part only
var data = filteredData.First();

string result = null;
if (data.Fajr <= now && now < data.Sunrise); // notice operators greed
    result = data.Fajr;
else if (data.Sunrise <= now && now <= data.Zuhr)
    result = data.Zuhr;
myTextBox.Text = result;