Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

C++ Jak przekonwertować czas z time_t na łańcuch znaków?

Ostatnio zmodyfikowano 2014-02-18 16:19
Autor Wiadomość
Kyriet
Temat założony przez niniejszego użytkownika
C++ Jak przekonwertować czas z time_t na łańcuch znaków?
» 2014-02-18 12:21:47
(Korzystam z Visual Studio)
Witajcie, mimo banalnego problemu, o którym się pewnie domyślasz z tematu nie jest to takie proste (dla mnie bynajmniej). Potrzebuję przekonwertować czas z sekund time_t (sekundy) na normalną datę z miesiącem, rokiem, dniem itd. Oczywiście jest wieeele przykładów w sieci, również w tym serwisie. Pozwólcie, że przytoczę fragment kodu z dokumentacji tutaj:
C/C++
#include <ctime>
#include <cstdio>
int main()
{
    time_t czas = 0;
    printf( "Czas zerowy: %s", ctime( & czas ) );
   
    time( & czas );
    printf( "Czas lokalny: %s", ctime( & czas ) );
    return 0;
}
Pomijam to, że jest to napisane w języku C. Problem w tym, że ten, jak i inny przykład... nie działa. oto błąd, który się pojawia:
Błąd 1 error C4996: 'ctime': This function or variable may be unsafe. Consider using ctime_s instead. To disable deprecation, _CRT_SECURE_NO_WARNINGS. See online help for details.

Podobny problem miałem kiedyś z użyciem
getch()
, które Microsoft zamieniło sobie na
_getch()
. W tym wypadku również zrobiłem to co zasugerowano mi w błędzie, czyli zamieniłem
ctime
 na
ctime_s
, a co jak już zamieniłem?
1 IntelliSense: argument of type "time_t *" is incompatible with parameter of type "char *"
Błąd 2 error C2660: "ctime_s" : funkcja przyjmuje 3 argumenty

Werdykt? Nie mogę użyć ctime(), bo wyrzuca błąd, a nowa funkcja, którą mi zasugerowali przyjmuje 3 argumenty zamiast 1. Od razu dodam, że użycie tego
_CRT_SECURE_NO_WARNINGS
 odpada (chyba, że to jedyne wyjście, lecz po wpisaniu tej linijki wyskakuje, że to jest niezdefiniowane, więc nie wiem jak tego użyć). Nawet na stronie cplusplus.com nic nie ma o
ctime_s
, więc nie wiem jakie argumenty przyjmuje ta funkcja. Może jest inna funkcja konwertujaca. Zwykle odpowiedzi szukam w dokumentacjach, lecz co zrobić, gdy żaden przykład z dokumentacjii nie jest poprawny? Liczę na waszą pomoc, może ktoś na tym świecie jeszcze korzysta z Visual Studio i niech to sprawdzi u siebie. (instaluję wszystkie aktualizacje na bieżąco)
P-104865
maly
» 2014-02-18 13:06:55
Daj przed wszystkimi includami
#define _CRT_SECURE_NO_WARNINGS
 i powinno działać.
P-104867
alixir
» 2014-02-18 13:17:02
A tu masz przerobiony przykład z MSDN z użyciem nowszych funkcji:

C/C++
#include <time.h>
#include <iostream>

#define SIZE 26

int main( void )
{
    time_t ltime;
    char buf[ SIZE ];
    errno_t err;
   
    time( & ltime );
   
    err = ctime_s( buf, SIZE, & ltime );
    if( err != 0 )
    {
        std::cout << "Invalid Arguments for ctime_s. Error Code: " << err << std::endl;
    }
    std::cout << "The time is " << buf << std::endl;
   
    system( "pause" );
    return 0;
}
P-104869
Adik80
» 2014-02-18 13:47:52
Mozna jeszce chyba jakos tak:

C/C++
time_t czas = time( 0 );
char data[ 100 ]
strftime( data, 100, "%c", localtime( czas ) );

w C++11
C/C++
std::time_t czas = std::time( 0 );
std::cout << std::put_time( std::localtime( & czas ), "%c %Z" );

P-104870
Kyriet
Temat założony przez niniejszego użytkownika
» 2014-02-18 16:19:57
Dziękuję wam za pomoc. Za pomocą waszych przykładów stworzyłem funkcje, które mogą wypisać tylko miesiąc, tylko rok, tylko godzinę itp. i to wszystko po polsku. Będę mógł to modyfikować wedle swoich potrzeb i wypisywać datę i godzinę w jakiej chcę kolejności. Jeżeli ktoś chce, to umieszczam poniżej kod pliku, który należy dołączyć do programu.
PS Proszę, nie szukajcie w tym błędów i nie piszcie: "Po co tak? to bez sensu, lepiej było zrobić tak". Po prostu działa, a ja mam plik wszechstronnego zastosowania ;) UWAGA! Aby konsola poprawnie wyświetlała słowa "Styczeń", "Środa" i inne z polskimi znakami, należy w funkcji main() umieścić
setlocale( LC_ALL, "PL" )
 i proszę administrację, aby nie karała mnie za umieszczanie tego w tym dziale, ale jeżeli ktoś będzie miał podobny problem, to może skorzysta z tego.
C/C++
#include <time.h>
#include <string>

std::string fCzas();
std::string fDzien_tygodnia( std::string czas );
std::string fMiesiac( std::string czas );
std::string fMiesiac_liczba( std::string czas );
std::string fDzien_miesiaca( std::string czas );
std::string fGodzina_sek( std::string czas );
std::string fGodzina( std::string czas );
std::string fRok( std::string czas );

std::string Czas() //Funkcja służy do klejenia daty wedle własnego uznania
{
    std::string Czas = fCzas();
    std::string Dzien_tygodnia = fDzien_tygodnia( Czas );
    std::string Miesiac = fMiesiac( Czas );
    std::string Miesiac_liczba = fMiesiac_liczba( Czas );
    std::string Dzien_miesiaca = fDzien_miesiaca( Czas );
    std::string Godzina_sek = fGodzina_sek( Czas ); //z sekundami
    std::string Godzina = fGodzina( Czas ); //bez sekund, tylko Godzina i minuta
    std::string Rok = fRok( Czas );
   
    return( Dzien_miesiaca + "/" + Miesiac_liczba + "/" + Rok ); //Przykładowa zwracana wartość 18/03/2014
}

std::string fCzas() //Zwraca przekonwertowany czas, np. Tue Feb 18 14:34:06 2014
{
    #define SIZE 26
   
    time_t ltime;
    char buf[ SIZE ];
    errno_t err;
   
    time( & ltime );
   
    err = ctime_s( buf, SIZE, & ltime );
    if( err != 0 )
    {
        std::cout << "Invalid Arguments for ctime_s. Error Code: " << err << std::endl;
        return "0";
    }
    return buf;
}

std::string fDzien_tygodnia( std::string czas ) //Zwraca dzień tygodnia, np. Środa
{
    std::string Dzien_tygodnia;
    switch( czas[ 0 ] )
    {
    case 'M':
        {
            Dzien_tygodnia = "Poniedziałek"; break;
        }
    case 'T':
        {
            if( czas[ 1 ] == 'u' )
            {
                Dzien_tygodnia = "Wtorek";
            }
            if( czas[ 1 ] == 'h' )
            {
                Dzien_tygodnia = "Czwartek";
            }
            break;
        }
    case 'W':
        {
            Dzien_tygodnia = "Środa"; break;
        }
    case 'F':
        {
            Dzien_tygodnia = "Piątek"; break;
        }
    case 'S':
        {
            if( czas[ 1 ] == 'a' )
            {
                Dzien_tygodnia = "Sobota";
            }
            if( czas[ 1 ] == 'u' )
            {
                Dzien_tygodnia = "Niedziela";
            }
            break;
        }
    }
    return Dzien_tygodnia;
}

std::string fMiesiac( std::string czas ) //Zwraca miesiąc jako nazwę, np. Styczeń
{
    std::string Miesiac;
    switch( czas[ 4 ] )
    {
    case 'J':
        {
            if( czas[ 5 ] == 'a' )
            {
                Miesiac = "Styczeń";
            }
            else
            {
                if( czas[ 6 ] == 'n' )
                {
                    Miesiac = "Czerwiec";
                }
                if( czas[ 6 ] == 'l' )
                {
                    Miesiac = "Lipiec";
                }
            }
            break;
        }
    case 'F':
        {
            Miesiac = "Luty"; break;
        }
    case 'M':
        {
            if( czas[ 6 ] == 'r' )
            {
                Miesiac += "Marzec";
            }
            if( czas[ 6 ] == 'y' )
            {
                Miesiac = "Maj";
            }
            break;
        }
    case 'A':
        {
            if( czas[ 5 ] == 'p' )
            {
                Miesiac = "Kwiecień";
            }
            if( czas[ 5 ] == 'u' )
            {
                Miesiac = "Sierpień";
            }
            break;
        }
    case 'S':
        {
            Miesiac = "Wrzesień"; break;
        }
    case 'O':
        {
            Miesiac = "Październik"; break;
        }
    case 'N':
        {
            Miesiac = "Listopad"; break;
        }
    case 'D':
        {
            Miesiac = "Grudzień"; break;
        }
       
    } //switch
    return Miesiac;
}

std::string fMiesiac_liczba( std::string czas ) //Zwraca miesiąc w postaci liczby, np. 11
{
    std::string Miesiac_liczba;
    switch( czas[ 4 ] )
    {
    case 'J':
        {
            if( czas[ 5 ] == 'a' )
            {
                Miesiac_liczba = "01";
            }
            else
            {
                if( czas[ 6 ] == 'n' )
                {
                    Miesiac_liczba = "06";
                }
                if( czas[ 6 ] == 'l' )
                {
                    Miesiac_liczba = "07";
                }
            }
            break;
        }
    case 'F':
        {
            Miesiac_liczba = "02"; break;
        }
    case 'M':
        {
            if( czas[ 6 ] == 'r' )
            {
                Miesiac_liczba += "03";
            }
            if( czas[ 6 ] == 'y' )
            {
                Miesiac_liczba = "05";
            }
            break;
        }
    case 'A':
        {
            if( czas[ 5 ] == 'p' )
            {
                Miesiac_liczba = "04";
            }
            if( czas[ 5 ] == 'u' )
            {
                Miesiac_liczba = "08";
            }
            break;
        }
    case 'S':
        {
            Miesiac_liczba = "09"; break;
        }
    case 'O':
        {
            Miesiac_liczba = "10"; break;
        }
    case 'N':
        {
            Miesiac_liczba = "11"; break;
        }
    case 'D':
        {
            Miesiac_liczba = "12"; break;
        }
       
    } //switch
    return Miesiac_liczba;
}

std::string fDzien_miesiaca( std::string czas ) //Zwraca dzień miesiąca, np. 06
{
    std::string Dzien_miesiaca;
    Dzien_miesiaca.insert( 0, czas, 8, 2 );
    return Dzien_miesiaca;
}

std::string fGodzina_sek( std::string czas ) //Zwraca godzinę, np. 14:23:52
{
    std::string Godzina_sek;
    Godzina_sek.insert( 0, czas, 11, 9 );
    return Godzina_sek;
}

std::string fGodzina( std::string czas ) //Zwraca godzinę bez sekund, np. 14:23
{
    std::string Godzina;
    Godzina.insert( 0, czas, 11, 5 );
    return Godzina;
}

std::string fRok( std::string czas ) //Zwraca Rok, np. 2014
{
    std::string Rok;
    Rok.insert( 0, czas, 20, 4 );
    return Rok;
}
P-104877
« 1 »
  Strona 1 z 1