libMesh
Loading...
Searching...
No Matches
timestamp.C
Go to the documentation of this file.
1// The libMesh Finite Element Library.
2// Copyright (C) 2002-2026 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
3
4// This library is free software; you can redistribute it and/or
5// modify it under the terms of the GNU Lesser General Public
6// License as published by the Free Software Foundation; either
7// version 2.1 of the License, or (at your option) any later version.
8
9// This library is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12// Lesser General Public License for more details.
13
14// You should have received a copy of the GNU Lesser General Public
15// License along with this library; if not, write to the Free Software
16// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
18#include "libmesh/libmesh_config.h"
19
20// C++ includes
21#include <ctime>
22#include <sstream>
23#ifdef LIBMESH_HAVE_LOCALE
24#include <locale>
25#endif
26
27// Local includes
28#include "libmesh/timestamp.h"
29
30namespace libMesh
31{
32
33namespace Utility
34{
35// If the locale header is available, we will use the "C++" way of
36// creating a timestamp, otherwise, we'll fall back on the C way.
37std::string get_timestamp()
38{
39#ifdef LIBMESH_HAVE_LOCALE
40 // Create time_put "facet"
41 std::locale loc;
42 const std::time_put<char> & tp = std::use_facet <std::time_put<char>> (loc);
43
44 // Call C-style time getting functions
45 time_t now = time(nullptr);
46 tm * tm_struct = localtime(&now);
47
48 // Date will eventually be stored in this ostringstream's string
49 std::ostringstream date_stream;
50
51 // See below for documentation on the use of the
52 // std::time_put::put() function
53 tp.put(date_stream, /*s*/
54 date_stream, /*str*/
55 date_stream.fill(), /*fill*/
56 tm_struct, /*tm*/
57 'c'); /*format*/
58
59 // Another way to use it is to totally customize the format...
60 // char pattern[]="%d %B %Y %I:%M:%S %p";
61 // tp.put(date_stream, /*s*/
62 // date_stream, /*str*/
63 // date_stream.fill(), /*fill*/
64 // tm_struct, /*tm*/
65 // pattern, /*format begin*/
66 // pattern+sizeof(pattern)-1); /*format end */
67
68 return date_stream.str();
69#else
70 // C-style code originally found here:
71 // http://people.sc.fsu.edu/~burkardt/cpp_src/timestamp/timestamp.C
72 // Author: John Burkardt, 24 September 2003
73 const unsigned int time_size = 40;
74 char time_buffer[time_size];
75
76 time_t now = time (nullptr);
77 tm * tm_struct = localtime (&now);
78
79 // No more than time_size characters will be placed into the array. If the
80 // total number of resulting characters, including the terminating
81 // NUL character, is not more than time_size, strftime() returns the
82 // number of characters in the array, not counting the terminating
83 // NUL. Otherwise, zero is returned and the buffer contents are
84 // indeterminate.
85 size_t len = strftime ( time_buffer, time_size, "%c", tm_struct );
86
87 if (len != 0)
88 return std::string(time_buffer);
89 else
90 {
91 libMesh::out << "Error formatting time buffer, returning empty string!" << std::endl;
92 return std::string("");
93 }
94
95#endif // LIBMESH_HAVE_LOCALE
96}
97
98// std::time_put::put() documentation
99// s=Iterator pointing to the first character of the output sequence.
100//
101// str=Object of a class derived from ios_base (generally an output
102// stream object). It is used to obtain formatting information.
103//
104// fill=Fill character. The fill character is used in output insertion
105// operations to fill spaces when the format requires some character padding.
106//
107// tm=Pointer to an object of type struct tm
108//
109// format=The final argument to time_put::put is an individual format character.
110// The function will format some of the information pointed by the tm struct
111// into a sequence of characters as specified by this character, just as if
112// it was preceded by a percentage sign in a format string passed to strftime.
113// (see 'man strftime' for more...)
114// Example: 'c' is national representation of time and date
115// 'c' = Thu Feb 4 12:24:11 2010
116// tp.put(date_stream /*s*/,
117// date_stream /*str*/,
118// date_stream.fill() /*fill*/,
119// tm_struct, /*tm*/
120// 'c'/*format*/);
121
122// We can also pass to char * to the beginning and end of the desired format:
123// const charT * pattern, const charT * pat_end. This allows us to have the full
124// flexibility of strftime.
125// Example: "%d %B %Y %I:%M:%S %p"
126// 04 February 2010 01:44:10 PM
127}
128
129} // namespace libMesh
std::string get_timestamp()
Definition timestamp.C:37
The libMesh namespace provides an interface to certain functionality in the library.
OStreamProxy out