diff --git a/GUI/Models/JobItem.cpp b/GUI/Models/JobItem.cpp
index 3926272e4fc720ec2c53603f43d408cdd2d43b60..524c2d8083a5c430413844a0245a26d8c2726422 100644
--- a/GUI/Models/JobItem.cpp
+++ b/GUI/Models/JobItem.cpp
@@ -152,23 +152,34 @@ bool JobItem::isValidForFitting()
     return isTag(T_REALDATA) && getItem(T_REALDATA);
 }
 
-void JobItem::setBeginTime(const QString& begin_time)
+QDateTime JobItem::beginTime() const
 {
-    setItemValue(P_BEGIN_TIME, begin_time);
+    return QDateTime::fromString(getItemValue(P_BEGIN_TIME).toString(), Qt::ISODateWithMs);
 }
 
-void JobItem::setEndTime(const QString& end_time)
+void JobItem::setBeginTime(const QDateTime& begin_time)
 {
-    setItemValue(P_END_TIME, end_time);
+    setItemValue(P_BEGIN_TIME, begin_time.toString(Qt::ISODateWithMs));
 }
 
-// Sets duration (msec -> "sec.msec")
-void JobItem::setDuration(int duration)
+QDateTime JobItem::endTime() const
 {
-    QString str;
-    if (duration != 0)
-        str = QString("%7.3f").arg(duration / 1000.);
-    setItemValue(P_DURATION, str.simplified());
+    return QDateTime::fromString(getItemValue(P_END_TIME).toString(), Qt::ISODateWithMs);
+}
+
+void JobItem::setEndTime(const QDateTime& end_time)
+{
+    setItemValue(P_END_TIME, end_time.toString(Qt::ISODateWithMs));
+    QString duration;
+    if (end_time.isValid()) {
+        QDateTime begin_time = beginTime();
+        if (begin_time.isValid()) {
+            qint64 delta = begin_time.msecsTo(end_time);
+            if (delta >0)
+                duration = QString::number(delta / 1000., 'f', 3);
+        }
+    }
+    setItemValue(P_DURATION, duration);
 }
 
 QString JobItem::getComments() const
diff --git a/GUI/Models/JobItem.h b/GUI/Models/JobItem.h
index bad625a04c691eceb65b5a0482941b8b7bf09a2d..22506f34906e395e6ffb03139d496ee6ece1fd01 100644
--- a/GUI/Models/JobItem.h
+++ b/GUI/Models/JobItem.h
@@ -32,6 +32,8 @@ class RealDataItem;
 class ISimulation;
 class SimulationOptionsItem;
 
+#include <QDateTime>
+
 class BA_CORE_API_ JobItem : public SessionItem {
 
 private:
@@ -80,11 +82,11 @@ public:
     bool isFailed() const;
     bool isValidForFitting();
 
-    void setBeginTime(const QString& begin_time);
-
-    void setEndTime(const QString& end_time);
+    QDateTime beginTime() const;
+    void setBeginTime(const QDateTime& begin_time);
 
-    void setDuration(int duration);
+    QDateTime endTime() const;
+    void setEndTime(const QDateTime& end_time);
 
     QString getComments() const;
     void setComments(const QString& comments);
diff --git a/GUI/Models/JobQueueData.cpp b/GUI/Models/JobQueueData.cpp
index e109cb9fda4ab3d3106d6c72b8f79d7d3800f4d3..7d2922faf82c5d6b0ae73f90cd32d7ecf344a4dc 100644
--- a/GUI/Models/JobQueueData.cpp
+++ b/GUI/Models/JobQueueData.cpp
@@ -107,8 +107,8 @@ void JobQueueData::onStartedJob()
     auto jobItem = m_jobModel->getJobItemForIdentifier(worker->identifier());
     jobItem->setProgress(0);
     jobItem->setStatus("Running");
-    jobItem->setBeginTime(GUI::Helpers::currentDateTime());
-    jobItem->setEndTime(QString());
+    jobItem->setBeginTime(worker->simulationStart());
+    jobItem->setEndTime(QDateTime());
 }
 
 //! Performs necessary actions when job is finished.
@@ -223,8 +223,7 @@ void JobQueueData::clearSimulation(const QString& identifier)
 
 void JobQueueData::processFinishedJob(JobWorker* worker, JobItem* jobItem)
 {
-    jobItem->setEndTime(GUI::Helpers::currentDateTime());
-    jobItem->setDuration(worker->simulationDuration());
+    jobItem->setEndTime(worker->simulationEnd());
 
     // propagating status of runner
     if (worker->status() == "Failed") {
diff --git a/GUI/Models/JobWorker.cpp b/GUI/Models/JobWorker.cpp
index 400f38f1e6e453e669cf9c52d0240a54bf867fa8..322e87c32ce673ae30aa02425fcd6114a90a635d 100644
--- a/GUI/Models/JobWorker.cpp
+++ b/GUI/Models/JobWorker.cpp
@@ -23,7 +23,6 @@ JobWorker::JobWorker(const QString& identifier, ISimulation* simulation)
     , m_percentage_done(0)
     , m_job_status("Idle")
     , m_terminate_request_flag(false)
-    , m_simulation_duration(0)
 {
 }
 
@@ -40,7 +39,8 @@ int JobWorker::progress() const
 void JobWorker::start()
 {
     m_terminate_request_flag = false;
-    m_simulation_duration = 0;
+    m_simulation_start = QDateTime::currentDateTime();
+    m_simulation_end = QDateTime();
     emit started();
 
     if (m_simulation) {
@@ -51,14 +51,9 @@ void JobWorker::start()
         m_job_status = "Running";
 
         try {
-            QDateTime beginTime = QDateTime::currentDateTime();
             m_simulation->runSimulation();
             if (m_job_status != "Canceled")
                 m_job_status = "Completed";
-
-            QDateTime endTime = QDateTime::currentDateTime();
-            m_simulation_duration = static_cast<int>(beginTime.msecsTo(endTime));
-
         } catch (const std::exception& ex) {
             m_job_status = "Failed";
             m_percentage_done = 100;
@@ -74,6 +69,7 @@ void JobWorker::start()
         m_failure_message = "JobRunner::start() -> Error. ISimulation doesn't exist.";
     }
 
+    m_simulation_end = QDateTime::currentDateTime();
     emit progressUpdate();
     emit finished();
 }
@@ -88,9 +84,14 @@ QString JobWorker::failureMessage() const
     return m_failure_message;
 }
 
-int JobWorker::simulationDuration() const
+const QDateTime& JobWorker::simulationStart() const
+{
+    return m_simulation_start;
+}
+
+const QDateTime& JobWorker::simulationEnd() const
 {
-    return m_simulation_duration;
+    return m_simulation_end;
 }
 
 //! Sets request for JobRunner to terminate underlying domain simulation.
diff --git a/GUI/Models/JobWorker.h b/GUI/Models/JobWorker.h
index 0df779318915eaa580498fe3517e63428d173c52..2060d50f3aee6b5843e7112e984c759b21f3d88e 100644
--- a/GUI/Models/JobWorker.h
+++ b/GUI/Models/JobWorker.h
@@ -16,6 +16,7 @@
 #define BORNAGAIN_GUI_MODELS_JOBWORKER_H
 
 #include <QObject>
+#include <QDateTime>
 
 class ISimulation;
 
@@ -34,7 +35,8 @@ public:
 
     QString failureMessage() const;
 
-    int simulationDuration() const;
+    const QDateTime& simulationStart() const;
+    const QDateTime& simulationEnd() const;
 
 signals:
     void started();
@@ -54,7 +56,8 @@ private:
     QString m_job_status;
     bool m_terminate_request_flag;
     QString m_failure_message;
-    int m_simulation_duration;
+    QDateTime m_simulation_start;
+    QDateTime m_simulation_end;
 };
 
 #endif // BORNAGAIN_GUI_MODELS_JOBWORKER_H
diff --git a/GUI/Views/FitWidgets/FitSessionController.cpp b/GUI/Views/FitWidgets/FitSessionController.cpp
index 7590171e6eda5b80614a92085c29c6e9b579a064..136a04564633f56a7e09d20328a97b18ec15c6ae 100644
--- a/GUI/Views/FitWidgets/FitSessionController.cpp
+++ b/GUI/Views/FitWidgets/FitSessionController.cpp
@@ -123,9 +123,8 @@ void FitSessionController::onFittingStarted()
 
     m_jobItem->setStatus("Fitting");
     m_jobItem->setProgress(0);
-    m_jobItem->setBeginTime(GUI::Helpers::currentDateTime());
-    m_jobItem->setEndTime(QString());
-    m_jobItem->setDuration(0);
+    m_jobItem->setBeginTime(m_runFitManager->fitStart());
+    m_jobItem->setEndTime(QDateTime());
 
     emit fittingStarted();
 }
@@ -134,9 +133,8 @@ void FitSessionController::onFittingFinished()
 {
     if (m_jobItem->getStatus() != "Failed")
         m_jobItem->setStatus("Completed");
-    m_jobItem->setEndTime(GUI::Helpers::currentDateTime());
+    m_jobItem->setEndTime(m_runFitManager->fitEnd());
     m_jobItem->setProgress(100);
-    m_jobItem->setDuration(m_runFitManager->getDuration());
 
     if (m_jobItem->isCompleted())
         m_fitlog->append("Done", FitLogFlags::SUCCESS);
@@ -150,6 +148,7 @@ void FitSessionController::onFittingError(const QString& text)
     message.append("Current settings cause fitting failure.\n\n");
     message.append(text);
     m_fitlog->append(message.toStdString(), FitLogFlags::ERROR);
+    m_jobItem->setEndTime(m_runFitManager->fitEnd());
 
     emit fittingError(message);
 }
diff --git a/GUI/Views/FitWidgets/FitWorker.cpp b/GUI/Views/FitWidgets/FitWorker.cpp
index f4fc67175042acdcbdb9f2db2df61e64064e39a8..6fe0d485431adbc80b5e62618054a47931ca10eb 100644
--- a/GUI/Views/FitWidgets/FitWorker.cpp
+++ b/GUI/Views/FitWidgets/FitWorker.cpp
@@ -18,19 +18,13 @@
 
 void FitWorker::startFit()
 {
-    int duration(0);
-    QDateTime beginTime = QDateTime::currentDateTime();
-
     emit started();
     try {
         m_fit_objective->runFit();
-        duration = durationSince(beginTime);
-
     } catch (const std::exception& ex) {
-        duration = durationSince(beginTime);
         emit error(QString::fromLatin1(ex.what()));
     }
-    emit finished(duration);
+    emit finished();
 }
 
 void FitWorker::interruptFitting()
@@ -38,9 +32,3 @@ void FitWorker::interruptFitting()
     if (m_fit_objective)
         m_fit_objective->interruptFitting();
 }
-
-int FitWorker::durationSince(const QDateTime& since)
-{
-    QDateTime endTime = QDateTime::currentDateTime();
-    return int(since.msecsTo(endTime));
-}
diff --git a/GUI/Views/FitWidgets/FitWorker.h b/GUI/Views/FitWidgets/FitWorker.h
index 871a320394e4dfb51bd5889af1be227f55dbb988..60184815a9bb608dddcfd040159f847c3c224e86 100644
--- a/GUI/Views/FitWidgets/FitWorker.h
+++ b/GUI/Views/FitWidgets/FitWorker.h
@@ -36,12 +36,11 @@ signals:
 
     void started();
 
-    void finished(int duration);
+    void finished();
 
     void error(const QString& message);
 
 private:
-    int durationSince(const class QDateTime& since);
     std::shared_ptr<FitObjectiveBuilder> m_fit_objective;
 };
 
diff --git a/GUI/Views/FitWidgets/FitWorkerLauncher.cpp b/GUI/Views/FitWidgets/FitWorkerLauncher.cpp
index 31abed06d6e653ccd2bb1d33c99ea9f98d8438d5..6a528b55542e152bee05bf2e3d5c377e4bdfab54 100644
--- a/GUI/Views/FitWidgets/FitWorkerLauncher.cpp
+++ b/GUI/Views/FitWidgets/FitWorkerLauncher.cpp
@@ -17,7 +17,7 @@
 #include <QThread>
 
 FitWorkerLauncher::FitWorkerLauncher(QObject* parent)
-    : QObject(parent), m_is_fit_running(false), m_duration(0)
+    : QObject(parent), m_is_fit_running(false)
 {
 }
 
@@ -48,28 +48,33 @@ void FitWorkerLauncher::runFitting(std::shared_ptr<FitObjectiveBuilder> suite)
     thread->start();
 }
 
-//! Returns duration of fit in msec.
+const QDateTime& FitWorkerLauncher::fitStart() const
+{
+    return m_fit_start;
+}
 
-int FitWorkerLauncher::getDuration() const
+const QDateTime& FitWorkerLauncher::fitEnd() const
 {
-    return m_duration;
+    return m_fit_end;
 }
 
 void FitWorkerLauncher::interruptFitting()
 {
     if (m_is_fit_running)
-        emit intern_interruptFittingWorker();
+        emit intern_interruptFittingWorker(QPrivateSignal());
 }
 
-void FitWorkerLauncher::intern_workerFinished(int duration)
+void FitWorkerLauncher::intern_workerFinished()
 {
     m_is_fit_running = false;
-    m_duration = duration;
+    m_fit_end = QDateTime::currentDateTime();
     emit fittingFinished();
 }
 
 void FitWorkerLauncher::intern_workerStarted()
 {
+    m_fit_start = QDateTime::currentDateTime();
+    m_fit_end = QDateTime();
     emit fittingStarted();
 }
 
diff --git a/GUI/Views/FitWidgets/FitWorkerLauncher.h b/GUI/Views/FitWidgets/FitWorkerLauncher.h
index 752f4df5cdf2b52f0d93777870ef9b74b234c029..336a022d750bbe7dbcfd16d7496c9d57581880f9 100644
--- a/GUI/Views/FitWidgets/FitWorkerLauncher.h
+++ b/GUI/Views/FitWidgets/FitWorkerLauncher.h
@@ -16,6 +16,7 @@
 #define BORNAGAIN_GUI_VIEWS_FITWIDGETS_FITWORKERLAUNCHER_H
 
 #include <QObject>
+#include <QDateTime>
 #include <atomic>
 #include <memory>
 
@@ -29,7 +30,8 @@ public:
 
     void runFitting(std::shared_ptr<FitObjectiveBuilder> suite);
 
-    int getDuration() const;
+    const QDateTime& fitStart() const;
+    const QDateTime& fitEnd() const;
 
 public slots:
     void interruptFitting();
@@ -38,10 +40,11 @@ signals:
     void fittingStarted();
     void fittingFinished();
     void fittingError(const QString& message);
-    void intern_interruptFittingWorker();
+
+    void intern_interruptFittingWorker(QPrivateSignal);
 
 private slots:
-    void intern_workerFinished(int duration);
+    void intern_workerFinished();
 
     void intern_workerStarted();
 
@@ -49,7 +52,8 @@ private slots:
 
 private:
     std::atomic<bool> m_is_fit_running;
-    int m_duration;
+    QDateTime m_fit_start;
+    QDateTime m_fit_end;
 };
 
 #endif // BORNAGAIN_GUI_VIEWS_FITWIDGETS_FITWORKERLAUNCHER_H
diff --git a/GUI/utils/Helpers.cpp b/GUI/utils/Helpers.cpp
index a4f15acbdf3e6e6f529f674d7b6a6b27c4aa441c..5fd0a9496cfb22461909e243e7a37188528c40b1 100644
--- a/GUI/utils/Helpers.cpp
+++ b/GUI/utils/Helpers.cpp
@@ -120,12 +120,6 @@ QString baseName(const QString& fileName)
     return info.baseName();
 }
 
-QString currentDateTime()
-{
-    return QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss");
-    ;
-}
-
 QVector<double> fromStdVector(const std::vector<double>& data)
 {
     QVector<double> result;
diff --git a/GUI/utils/Helpers.h b/GUI/utils/Helpers.h
index 9d6d0dd770dff8eead4a20e489297cdb12759546..abe651e20bcfa17f89811a251cee027bd6cfff7e 100644
--- a/GUI/utils/Helpers.h
+++ b/GUI/utils/Helpers.h
@@ -34,8 +34,6 @@ int versionCode(const QString& version);
 
 bool isVersionMatchMinimal(const QString& version, const QString& minimal_version);
 
-QString currentDateTime();
-
 QStringList fromStdStrings(const std::vector<std::string>& container);
 
 QVector<double> fromStdVector(const std::vector<double>& data);