Timer, podawanie argumentów do DateTime

Timer, podawanie argumentów do DateTime

Wątek przeniesiony 2015-12-13 15:44 z C# i .NET przez somekind.

0

Witam. Zrobiłem timer w konsoli z dosyć zgrabną i prostą mechaniką. Przy tworzeniu obiektu klasy DateTime jest błąd przy przekazywaniu argumentów. Na wypadek gdyby użytkownik podał nie prawidłowe dane tworzenie obiektu klasy DateTime jest zabezpieczone try and catch'em, lecz obojętnie jakie wartości podam nawet jeżeli są prawdziwe wyświetla się błąd.

Kod:

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

namespace DateTim
{
    class Program
    {
        static string czas;

        static int year, month, day, hour, min, seconds;

        static void Main(string[] args)
        {

            Console.WriteLine("Podaj rok, miesiąc, dzień, godzinę, minutę, sekundę (W TAKIEJ KOLEJNOŚCI!!!)");
            try
            {
                year = Console.Read(); month = Console.Read(); day = Console.Read(); hour = Console.Read(); min = Console.Read(); seconds = Console.Read();

                DateTime argument = new DateTime(year, month, day, hour, min, seconds, DateTimeKind.Local);

                licznik(argument);
            }

            catch (Exception ex)
            {
                Console.WriteLine("Wystąpił błąd! Któraś z podanych wartości prawdopodobnie nie jest liczbą!");
                Console.ReadKey();
            }
        }

        static string licznik(DateTime data)
        {
            DateTime teraz = DateTime.Now;

            if (teraz < data) Console.WriteLine("To już minęło!");

            TimeSpan odc_czasu = data - teraz;

            string[] stringi = new string[6];

            if ((year < 10) || (month < 10) || (day < 10) || (hour < 10) || (min < 10) || (seconds < 10))
            {
                if (year < 10) stringi[0] = "0" + stringi[0];
                if (month < 10) stringi[1] = "0" + stringi[0];
                if (day < 10) stringi[2] = "0" + stringi[0];
                if (hour < 10) stringi[3] = "0" + stringi[0];
                if (min < 10) stringi[4] = "0" + stringi[0];
                if (seconds < 10) stringi[5] = "0" + stringi[0];
            }

            while((seconds == 0) && (min == 0) && (hour == 0) && (day == 0) && (month == 0) && (year == 0))
            {
                if (seconds != 0) seconds--;
                if ((seconds == 0) && (min != 0)) min--;
                if ((min == 0) && (hour != 0)) hour--;
                if ((hour == 0) && (day != 0)) day--;
                if ((day == 0) && (month != 0)) month--;
                if ((month == 0) && (year != 0)) year--;

                stringi[0] = year.ToString(); stringi[1] = month.ToString(); stringi[2] = day.ToString(); stringi[3] = hour.ToString(); stringi[4] = min.ToString(); stringi[5] = seconds.ToString();
                czas = stringi[0] + stringi[1] + stringi[2] + stringi[3] + stringi[4] + stringi[5];

                Thread.Sleep(1000);
            }

            return czas;
        }
    }
}

PS. Mam jeszcze takie pytanie. W jaki sposób można napisać program, który włączy się przy uruchamianiu komputera i tylko w tray'u?

edytowany 1x, ostatnio: somekind
grzesiek51114
grzesiek51114
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:2442
1

A nie lepiej robić tak:

Kopiuj
        try {
            var date = Console.ReadLine();
            var time = DateTime.Parse(date);
            Console.WriteLine(time.ToString());
        }
        catch (FormatException) {
            Console.WriteLine("Please enter the date in a correct format: dd.mm.yyyy hh:mm:ss");
        }

Ewentualnie jeszcze tak, jeżeli ma być tak jak chcesz:

Kopiuj
        try {
            var date = Console.ReadLine();
            var time = DateTime.ParseExact(date, "ddMMyyyyHHmmss", CultureInfo.InvariantCulture);
            Console.WriteLine(time.ToString());
        }
        catch (FormatException) {
            Console.WriteLine("Please enter the date in a correct format.");
        }

W ogóle napisałbym to od nowa.

edytowany 4x, ostatnio: grzesiek51114
0
grzesiek51114 napisał(a):

A nie lepiej robić tak:

Kopiuj
        try {
            var date = Console.ReadLine();
            var time = DateTime.Parse(date);
            Console.WriteLine(time.ToString());
        }
        catch (FormatException) {
            Console.WriteLine("Please enter the date in a correct format: dd.mm.yyyy hh:mm:ss");
        }

W ogóle napisałbym to od nowa.

Dlaczego od razu od nowa? Wydaje mi się, że mechanika tego programu jest całkiem ok.

grzesiek51114
grzesiek51114
Sformatuj ten kod żeby dało się to czytać. Użyj znaczników &lt;code=csharp&gt;&lt;/code&gt;
NE
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 8 lat
  • Postów:186
0

Console.Read() czyta jeden znak, więc jeśli wpiszesz rok "2015", to każda cyfra zostanie przypisana do innej zmiennej. Co więcej, rok to nie będzie liczba 2, tylko kod ASCII dla znaku '2', który wynosi 50. Miesiąc to będzie ASCII dla '0', czyli 48. Nie ma miesiąca o numerze 48, więc nijak z tego daty nie utworzysz.


(konto nieaktywne)
0
ness napisał(a):

Console.Read() czyta jeden znak, więc jeśli wpiszesz rok "2015", to każda cyfra zostanie przypisana do innej zmiennej. Co więcej, rok to nie będzie liczba 2, tylko kod ASCII dla znaku '2', który wynosi 50. Miesiąc to będzie ASCII dla '0', czyli 48. Nie ma miesiąca o numerze 48, więc nijak z tego daty nie utworzysz.

Więc jak to napisać aby wczytać datę?

0

Na przyklad tak jak zaproponowal grzesiek51114.

Jeremi napisał(a):

Wydaje mi się, że mechanika tego programu jest całkiem ok.

Serio? Przeciez ten program w ogole nie ma prawa dzialac...
Liczysz odc_czasu i nigdzie tego nie wykorzystujesz wiec po co to jest?
Poza tym petla while nie wykona sie ani razu chyba, ze ktos wprowadzi date 000000.

A tego ifa:

Kopiuj
 if ((year < 10) || (month < 10) || (day < 10) || (hour < 10) || (min < 10) || (seconds < 10))
            {
                if (year < 10) stringi[0] = "0" + stringi[0];
                if (month < 10) stringi[1] = "0" + stringi[0];
                if (day < 10) stringi[2] = "0" + stringi[0];
                if (hour < 10) stringi[3] = "0" + stringi[0];
                if (min < 10) stringi[4] = "0" + stringi[0];
                if (seconds < 10) stringi[5] = "0" + stringi[0];
            } 

to juz w ogole nie rozumiem :)

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Wrocław
1
Jeremi napisał(a):

Dlaczego od razu od nowa? Wydaje mi się, że mechanika tego programu jest całkiem ok.

I co on niby robi? Bo to się chyba tylko do Perełek nadaje.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.