QGIS API Documentation  3.25.0-Master (10b47c2603)
qgsdatetimefieldformatter.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsdatetimefieldformatter.cpp - QgsDateTimeFieldFormatter
3 
4  ---------------------
5  begin : 2.12.2016
6  copyright : (C) 2016 by Matthias Kuhn
7  email : [email protected]
8  ***************************************************************************
9  * *
10  * This program is free software; you can redistribute it and/or modify *
11  * it under the terms of the GNU General Public License as published by *
12  * the Free Software Foundation; either version 2 of the License, or *
13  * (at your option) any later version. *
14  * *
15  ***************************************************************************/
17 
18 #include "qgssettings.h"
19 #include "qgsfield.h"
20 #include "qgsvectorlayer.h"
21 #include "qgsapplication.h"
22 
23 QString QgsDateTimeFieldFormatter::DATE_FORMAT = QStringLiteral( "yyyy-MM-dd" );
24 const QString QgsDateTimeFieldFormatter::TIME_FORMAT = QStringLiteral( "HH:mm:ss" );
25 QString QgsDateTimeFieldFormatter::DATETIME_FORMAT = QStringLiteral( "yyyy-MM-dd HH:mm:ss" );
26 // we need to use Qt::ISODate rather than a string format definition in QDate::fromString
27 const QString QgsDateTimeFieldFormatter::QT_ISO_FORMAT = QStringLiteral( "Qt ISO Date" );
28 // but QDateTimeEdit::setDisplayFormat only accepts string formats, so use with time zone by default
29 const QString QgsDateTimeFieldFormatter::DISPLAY_FOR_ISO_FORMAT = QStringLiteral( "yyyy-MM-dd HH:mm:ss+t" );
30 
31 
33 {
34  return QStringLiteral( "DateTime" );
35 }
36 
37 QString QgsDateTimeFieldFormatter::representValue( QgsVectorLayer *layer, int fieldIndex, const QVariantMap &config, const QVariant &cache, const QVariant &value ) const
38 {
39  Q_UNUSED( cache )
40 
41  QString result;
42 
43  if ( value.isNull() )
44  {
46  }
47 
48  const QgsField field = layer->fields().at( fieldIndex );
49  const bool fieldIsoFormat = config.value( QStringLiteral( "field_iso_format" ), false ).toBool();
50  const QString fieldFormat = config.value( QStringLiteral( "field_format" ), defaultFormat( field.type() ) ).toString();
51  const QString displayFormat = config.value( QStringLiteral( "display_format" ), defaultFormat( field.type() ) ).toString();
52 
53  QDateTime date;
54  bool showTimeZone = false;
55  if ( static_cast<QMetaType::Type>( value.type() ) == QMetaType::QDate )
56  {
57  date = value.toDateTime();
58  }
59  else if ( static_cast<QMetaType::Type>( value.type() ) == QMetaType::QDateTime )
60  {
61  date = value.toDateTime();
62  // we always show time zones for datetime values
63  showTimeZone = true;
64  }
65  else if ( static_cast<QMetaType::Type>( value.type() ) == QMetaType::QTime )
66  {
67  return value.toTime().toString( displayFormat );
68  }
69  else
70  {
71  if ( fieldIsoFormat )
72  {
73  date = QDateTime::fromString( value.toString(), Qt::ISODate );
74  }
75  else
76  {
77  date = QDateTime::fromString( value.toString(), fieldFormat );
78  }
79  }
80 
81  if ( date.isValid() )
82  {
83  if ( showTimeZone && displayFormat == QgsDateTimeFieldFormatter::DATETIME_FORMAT )
84  {
85  // using default display format for datetimes, so ensure we include the timezone
86  result = QStringLiteral( "%1 (%2)" ).arg( date.toString( displayFormat ), date.timeZoneAbbreviation() );
87  }
88  else
89  {
90  result = date.toString( displayFormat );
91  }
92  }
93  else
94  {
95  result = value.toString();
96  }
97 
98  return result;
99 }
100 
101 QString QgsDateTimeFieldFormatter::defaultFormat( QVariant::Type type )
102 {
103  switch ( type )
104  {
105  case QVariant::DateTime:
107  case QVariant::Time:
109  default:
111  }
112 }
113 
115 {
116  QString dateFormat = QLocale().dateFormat( QLocale::FormatType::ShortFormat );
119 }
static QString nullRepresentation()
This string is used to represent the value NULL throughout QGIS.
static void applyLocaleChange()
Adjusts the date time formats according to locale.
QString representValue(QgsVectorLayer *layer, int fieldIndex, const QVariantMap &config, const QVariant &cache, const QVariant &value) const override
Create a pretty String representation of the value.
QString id() const override
Returns a unique id for this field formatter.
static const QString DISPLAY_FOR_ISO_FORMAT
static QString defaultFormat(QVariant::Type type)
Gets the default format in function of the type.
Encapsulate a field in an attribute table or data source.
Definition: qgsfield.h:51
QVariant::Type type
Definition: qgsfield.h:58
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
Definition: qgsfields.cpp:163
Represents a vector layer which manages a vector based data sets.
QgsFields fields() const FINAL
Returns the list of fields of this layer.
const QgsField & field
Definition: qgsfield.h:463