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

Timer, podawanie argumentów do DateTime

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:

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?

1

A nie lepiej robić tak:

        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:

        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.

0
grzesiek51114 napisał(a):

A nie lepiej robić tak:

        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.

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.

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:

 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 :)

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.

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