【问题标题】:How to get all timezones list in Qt?如何在 Qt 中获取所有时区列表?
【发布时间】:2012-03-21 12:15:43
【问题描述】:

有什么方法可以获取所有时区 IST、ET 等的列表。

我必须在我的应用程序中使用它们。

【问题讨论】:

    标签: qt timezone qt4.7


    【解决方案1】:

    ICU Library 是可移植的,可以在 Qt 应用程序中使用。 (它有一个 C/C++ API。)在它的许多其他特性中,有一个 TimeZone 类可以枚举系统已知的时区。

    如果您只需要一个简单的列表,这可能有点矫枉过正,但如果您希望使用这些时区并与其他元数据(语言环境等)进行交互,这将是一个很好的解决方案。

    【讨论】:

    • 我不知道从哪里获取给定链接的库,有没有办法直接在我的 symbain 项目中添加这些库?
    • 下载页面为:site.icu-project.org/download。该页面包含二进制和源代码下载的链接,以及 Subversion 存储库的地址。我没有使用 Symbian 环境的经验,所以恐怕我无法提供任何细节; ICU 库是一个普通的 C/C++ 库——包括头文件,将库的路径添加到链接器。您可能想为 Symbian 特定的帮助创建一个新问题。
    【解决方案2】:

    还有一个使用 qt5.2 中新的 QTimeZone 类的示例,描述为here

    他们创建了一个自定义小部件,其中列出了所有已知的时区以及它们的特殊设置,例如夏令时等。

    那里发布的基本代码是:

    #include <QDebug>
    #include <QByteArray>
    #include <QDateTime>
    #include <QList>
    #include <QTimeZone>
    
    #include "widget.h"
    #include "ui_widget.h"
    
    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
    
        // Fill in combo box.
        QList<QByteArray> ids = QTimeZone::availableTimeZoneIds();
        foreach (QByteArray id, ids) {
            ui->timeZoneComboBox->addItem(id);
        }
    
        // Connect combo box to slot to update fields.
        connect(ui->timeZoneComboBox, SIGNAL(currentIndexChanged(int)),
                SLOT(UpdateFields()));
    
        // Update fields for initial value.
        UpdateFields();
    }
    
    void Widget::UpdateFields() {
    
      QByteArray id = ui->timeZoneComboBox->currentText().toLatin1();
      QTimeZone zone = QTimeZone(id);
    
      // Fill in fields for current time zone.
      if (zone.isValid()) {
          ui->descriptionLabel->setText(tr("<b>Description:</b> ") + id);
          ui->countryLabel->setText(tr("<b>Country:</b> ") +    
              QLocale::countryToString(zone.country()));
          ui->hasDaylightTimeCheckBox->setChecked(zone.hasDaylightTime());
          ui->isDaylightTimeCheckBox->setChecked(
              zone.isDaylightTime(QDateTime::currentDateTime()));
          ui->hasTransitionsCheckBox->setChecked(zone.hasTransitions());
          QDateTime zoneTime = QDateTime(
              QDate::currentDate(), QTime::currentTime(), zone).toLocalTime();
          ui->dateEdit->setDate(zoneTime.date());
          ui->timeEdit->setTime(zoneTime.time());
    
          QTimeZone::OffsetData offset = zone.nextTransition(
              QDateTime::currentDateTime());
          if (offset.atUtc != QDateTime()) {
              ui->nextTransitionLabel->setEnabled(true);
              ui->nextTransitionLabel->setText(
              tr("<b>Next transition:</b> %1").arg(offset.atUtc.toString()));
          } else {
              ui->nextTransitionLabel->setEnabled(false);
              ui->nextTransitionLabel->setText(
                  tr("<b>Next transition:</b> none"));
          }
      }
    }
    

    【讨论】:

      【解决方案3】:

      您需要在运行时以某种方式找到它,还是为了您的源代码?如果是第二种情况,可以使用this list

      【讨论】:

      • 我的源代码需要它,但如果用户选择时区,我的应用程序应该以该标准显示时间。我该怎么做?
      • 要实现这一点,可能任何一种解决方案都是可能的。在源代码中对时区进行硬编码可能是一种更简单的方法,但从系统中获取时区具有不需要维护的优点,假设在极少数情况下时区发生更改,它们将反映在您正在使用的外部资源中。不过,看看这应该是一个极其罕见的事件,这似乎有点过头了。
      【解决方案4】:

      【讨论】:

      • 请注意,这不是 Qt 原生解决方案,因此不能移植到所有平台。
      • Moi,我知道 :),但应该给“abhishek”正确的接近方式
      猜你喜欢
      • 1970-01-01
      • 2016-10-25
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      • 1970-01-01
      相关资源
      最近更新 更多