Konwersja daty

Odpowiedz Nowy wątek
2019-08-25 19:06
0

Cześć, Napisałem prostą funkcję która konwertuje czas na np 1 godzinę temu itd. Mam problem jesli chodzi o 7 dni
Gdy powinno wypisać 7 dni temu wypisuje mi pełną date nie wiem czemu :(

        private const uint SECOND = 1;
        private const uint MINUTE = 60 * SECOND;
        private const uint HOUR = 60 * MINUTE;
        private const uint DAY = 24 * HOUR;
        private const uint WEEK = 7 * DAY;

            if(delta < DAY)
            {
                if(ts.Hours == 1)
                {
                    return "godzinę temu";
                }
                else if(ts.Hours <= 4)
                {
                    return ts.Hours + " godziny temu";
                }
                else
                {
                    return ts.Hours + " godzin temu";
                }
            }

            if(delta <= WEEK)
            {
                if(ts.Days == 1)
                {
                    return "wczoraj";
                }
                else
                {
                    return ts.Days + " dni temu";
                }
            }
            var item = new DateTime(2019, 8, 23);
            var item1 = new DateTime(2019, 8, 25, 10, 54, 0);
            var item2 = new DateTime(2019, 8, 25, 14, 54, 0);
            var item4 = new DateTime(2019, 8, 24, 14, 54, 0);
            //Ten test nie działa
            var item3 = new DateTime(2019, 8, 18, 19, 0, 0);

            var result = ConvertDate.ConvertRelativeDate(item);
            var result1 = ConvertDate.ConvertRelativeDate(item1);
            var result2 = ConvertDate.ConvertRelativeDate(item2);
            var result4 = ConvertDate.ConvertRelativeDate(item4);

            //Nie działa
            var result3 = ConvertDate.ConvertRelativeDate(item3);

            Assert.AreEqual("2 dni temu", result);
            Assert.AreEqual("8 godzin temu", result1);
            Assert.AreEqual("4 godziny temu", result2);
            Assert.AreEqual("wczoraj", result4);
            //Nie działa
            Assert.AreEqual("7 dni temu", result3);

Pozostało 580 znaków

2019-08-25 21:35
1

W jaki sposob obliczasz "delta", nie widac tej czesci kodu. Probowales debugowac aplikacje?

Pozostało 580 znaków

2019-08-26 06:47
0
            var ts = new TimeSpan(DateTime.Now.Ticks - youtDate.Ticks);
            double delta = Math.Abs(ts.TotalSeconds);

Kurcze debuguje i niby działa tylko problem jest z tymi 7 dniami

Wydaje mi się czy nie obsługujesz przypadku gdy delta jest większa niż WEEK? - akerman 2019-08-26 09:06

Pozostało 580 znaków

2019-08-26 09:07
0

Znaczy mam tak:

            if(delta <= WEEK)
            {
                if(ts.Days == 1)
                {
                    return "wczoraj";
                }
                else
                {
                    return ts.Days + " dni temu";
                }
            }

            return youtDate.ToString();

A całość wygląda tak:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Blog.Utils
{
    public class ConvertDate
    {
        private const uint SECOND = 1;
        private const uint MINUTE = 60 * SECOND;
        private const uint HOUR = 60 * MINUTE;
        private const uint DAY = 24 * HOUR;
        private const uint WEEK = 7 * DAY;

        public static string ConvertRelativeDate(DateTime youtDate)
        {
            var ts = new TimeSpan(DateTime.Now.Ticks - youtDate.Ticks);
            double delta = Math.Abs(ts.TotalSeconds);

            if(delta <= MINUTE)
            {
                if(ts.Seconds == 1)
                {
                    return "sekunde temu";
                }
                else if(ts.Seconds <=4)
                {
                    return ts.Seconds + " sekundy temu";
                }
                else
                {
                    return ts.Seconds + " sekund temu";
                }
            }
            if(delta <= HOUR)
            {
                if(ts.Minutes == 1)
                {
                    return "minute temu";
                }
                else if (ts.Minutes <= 4)
                {
                    return ts.Minutes + " minuty temu";
                }
                else
                {
                    return ts.Minutes + " minut temu";
                }
            }

            if(delta <= DAY)
            {
                if(ts.Hours == 1)
                {
                    return "godzinę temu";
                }
                else if(ts.Hours <= 4)
                {
                    return ts.Hours + " godziny temu";
                }
                else
                {
                    return ts.Hours + " godzin temu";
                }
            }

            if(delta <= WEEK)
            {
                if(ts.Days == 1)
                {
                    return "wczoraj";
                }
                else
                {
                    return ts.Days + " dni temu";
                }
            }

            if(delta > WEEK)
            {
                return youtDate.ToString();
            }

            return youtDate.ToString();

        }

    }
}
edytowany 1x, ostatnio: Michał Warmuz, 2019-08-26 09:15

Pozostało 580 znaków

2019-08-26 09:31
1

Nie rozumiem. Po co właściwie tworzysz WEEK skoro funkcja ma zwracac ilość dni? Gdy delta jest większa od week funkcja zwraca Ci po prostu stringa daty, a to nie jest to czego oczekujesz. Dopisz co ma wtedy robić. I chyba lepiej korzystać w takich przypadkach z else if niż z osobnych ifów.

No i zadeklaruj sobie stringa, którego wartość będziesz ustawiał w poszczegolnych ifach a na końcu go zwróć, zamiast dawać return pod każdym warunkiem. - akerman 2019-08-26 09:38

Pozostało 580 znaków

2019-08-26 09:54
0

Znaczy chciałem aby po 7 dniach Data była juz nie konwersowana na ten tekst
Chciałbym aby było że gdy jest tydzien 7 dni. Pisało 7 dni temu a kolejny dzień zamiast 8 dni temu to juz normalna data

edytowany 1x, ostatnio: Michał Warmuz, 2019-08-26 09:55
Funkcja liczy Ci czas od DateTime.Now, więc trudno się wstrzelić, żeby było dokładnie 7 dni bo to tylko jedna sekunda, potem zwraca string daty. - akerman 2019-08-26 10:10
Kurde to czemu działaja godziny minuty i sekundy bo nie rozumiem :( - Michał Warmuz 2019-08-26 10:21
Działają wszystkie wartośi <= WEEK (co do sekundy). Zmień ostatniego ifa na <= 8* DAY i będzie Ci pokazywal 7 dni a nie będzie pokazywał 8. - akerman 2019-08-26 10:34

Pozostało 580 znaków

2019-08-27 09:21

Nie wiem czy dobrze ale nie lepiej spróbować coś takiego?

public string ConvertRelativeDate(DateTime Date)
{
    DateTime CurrentDate = DateTime.Now;
    if(Date.Ticks > CurrentDate.Ticks)
        throw new Exception("Podana data <Date> jest wyższa od aktualnej <DateTime.Now>");
    TimeSpan timeBetween = new Timespan(CurrenDate.Ticks - Date.Ticks);
    if(timeBetween.totalSeconds == 1)
        return "Sekundę temu";
    if(timeBetween.totalSeconds <= 4)
        return timeBetween.totalSeconds.ToString() + " sekundy temu";
    if(timeBetween.totalSeconds < 60)
        return timeBetween.totalSeconds.ToString() + " sekund temu";
    if(timeBetween.totalMinutes == 1)
        return "Minutę temu";
    if(timeBetween.totalMinutes <= 4)
        return timeBetween.totalMinutes.ToString() + " minuty temu";
    if(timeBetween.totalMinutes < 60)
        return timeBetween.totalMinutes.ToString() + " minut temu";
    if(timeBetween.totalHours == 1)
        return "Godzinę temu";
    if(timeBetween.totalHours <= 4)
        return timeBetween.totalHours.ToString() + " godziny temu";
    if(timeBetween.totalHours < 60)
        return timeBetween.totalHours.ToString() + " godzin temu";

}

i potem możesz analogicznie do kodu dodać "totalDays", "totalMonths", "totalYears"

edytowany 3x, ostatnio: Grzegorz Świdwa, 2019-08-27 09:30
Poprawiłem kilka błędów, które zauważyłem - Grzegorz Świdwa 2019-08-27 09:24
Według dokumentacji powinno być "TotalMinutes" itp. zamiast "totalMinutes". Wybacz - Grzegorz Świdwa 2019-08-27 09:27
Typ CurrentDate zmieniony z long na DateTime. Boże jakie błędy porobiłem. Tak to jest pisać w notatniku - Grzegorz Świdwa 2019-08-27 09:30

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0