Путаница с форматом даты и времени США и Европы - PullRequest
1 голос
/ 07 сентября 2011

У меня есть такой вид xml, где 1-й январь и 1-й февраль - это собственно формат, означает dd.mm.yyyy

<?xml version="1.0" encoding="utf-8"?>
<eventManager>
    <event>
        <name>brith day0</name>
        <place>home</place>
        <latitude>60.170133</latitude>
        <longitude>24.938428</longitude>
        <date>01.01.2011</date>
        <time>00:00</time>
        <img>birthday.jpg</img>
    </event>
    <event>
        <name>brith day0</name>
        <place>home</place>
        <latitude>60.170133</latitude>
        <longitude>24.938428</longitude>
        <date>01.02.2011</date>
        <time>23:00</time>
        <img>birthday1.jpg</img>
    </event>
</eventManager>

Тогда класс с именем event, который получает все данные из вышеупомянутого события xml. Теперь я собираюсь проверить, равны ли две даты или нет. Для следующего случая это правда. Но это не так в соответствии с приведенным выше форматом XML.

if (CompareSameMonth(EventList[0]._date, EventList[1]._date)) { }

bool CompareSameMonth(DateTime dt1, DateTime dt2) 
{ 
    bool same = false; 

    Debug.WriteLine("dt1.Month "+dt1.Month.ToString()); // output dt1.Month 1 
    Debug.WriteLine("dt2.Month "+dt2.Month.ToString()); // output dt2.Month 1

    if (dt1.Year == dt2.Year && dt1.Month == dt2.Month) 
        same = true; 

    return same; 
 } 

Как это можно исправить с помощью проблемы c # wp7?

Добавление дополнительной информации о том, как я получил XML в EventList: -

public void ParseXml (содержимое строки) {

        m_XMLContent = XDocument.Parse(content);

        var data = from query in m_XMLContent.Descendants("event")
                   select new Event
                   {
                       name = (string)query.Element("name"),
                       place = (string)query.Element("place"),
                       latitude = (double)query.Element("latitude"),
                       longitude = (double)query.Element("longitude"),
                       _date = (DateTime)query.Element("date"),
                       _time = (DateTime)query.Element("time"),
                       imgLink = (string)query.Element("img")
                   };

       EventList.Sort(new DateTimeComparer());

    }

    public class DateTimeComparer : IComparer<Event>
    {
        public int Compare(Event x, Event y)
        {
            return x.date_time.CompareTo(y.date_time);
        }
    }

Ответы [ 2 ]

4 голосов
/ 07 сентября 2011

Для разбора даты и сравнения необходимо использовать объект CultureInfo.
Для разбора - культура США или Европы, для сравнения - Инвариантная культура .

string s1 = "01.01.2011";
string s2 = "01.02.2011";
bool result;
CultureInfo culture = CultureInfo.CreateSpecificCulture("de-DE");
DateTimeStyles styles = DateTimeStyles.None;
DateTime dateOne;
DateTime dateTwo;

if (DateTime.TryParse(s1, culture, styles, out dateOne) && DateTime.TryParse(s2, culture, styles, out dateTwo))
{
    result = dateOne.Equals(dateTow);
}
0 голосов
/ 07 сентября 2011

Вы должны попытаться сохранить даты в формате UTC, чтобы избежать двусмысленности между культурами ...

<eventManager>
    <event>
        <name>brith day0</name>
        <place>home</place>
        <latitude>60.170133</latitude>
        <longitude>24.938428</longitude>
        <dateTime>2011-01-01T00:00:00.000Z</dateTime>

Это, конечно, при условии, что у вас есть контроль над данными:)

Если нет, я бы порекомендовал преобразовать локализованное время даты в UTC, прежде чем начинать какие-либо операции с ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...