Skip to content

Commit b031c64

Browse files
author
Olivier Dufour
committed
export: datetime format and local time issue
1 parent 9db3c16 commit b031c64

File tree

3 files changed

+39
-23
lines changed

3 files changed

+39
-23
lines changed

addon/data-export.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1875,6 +1875,7 @@ function RecordTable(vm) {
18751875
let dateFormat = localStorage.getItem("dateFormat");
18761876
let datetimeFormat = localStorage.getItem("datetimeFormat");
18771877
let decimalFormat = localStorage.getItem("decimalFormat");
1878+
let convertToLocalTime = localStorage.getItem("convertToLocalTime") != "false";
18781879
if (decimalFormat != "." && decimalFormat != ",") {
18791880
decimalFormat = ".";
18801881
localStorage.setItem("decimalFormat", decimalFormat);
@@ -2005,6 +2006,8 @@ function RecordTable(vm) {
20052006
row[c] = convertDate(record[field], dateFormat);
20062007
} else if (columnType.get(field) == "datetime" && datetimeFormat) {
20072008
row[c] = convertDate(record[field], datetimeFormat);
2009+
} else if (columnType.get(field) == "datetime" && convertToLocalTime) {
2010+
row[c] = convertDtToLocalTime(record[field]);
20082011
} else if ((columnType.get(field) == "decimal" || columnType.get(field) == "currency") && decimalFormat && decimalFormat != ".") {
20092012
row[c] = record[field] ? record[field].toString().replace(".", decimalFormat) : record[field];
20102013
} else {
@@ -2015,11 +2018,29 @@ function RecordTable(vm) {
20152018
}
20162019
}
20172020
}
2021+
function convertDtToLocalTime(field) {
2022+
let dt = new Date(field);
2023+
let tzOffset = dt.getTimezoneOffset();// returns the difference in minutes.
2024+
dt.setMinutes(dt.getMinutes() - tzOffset);
2025+
let finalDate = dt.toISOString().replace("Z", "");
2026+
finalDate += (tzOffset > 0 ? "-" : "+");
2027+
tzOffset = Math.abs(tzOffset);
2028+
let offsetHours = Math.floor(tzOffset / 60);
2029+
let offsetMinutes = tzOffset % 60;
2030+
finalDate += String(offsetHours).padStart(2, "0");
2031+
finalDate += String(offsetMinutes).padStart(2, "0");
2032+
return finalDate;
2033+
}
20182034
function convertDate(field, format) {
20192035
if (!field) {
20202036
return "";
20212037
}
20222038
let dt = new Date(field);
2039+
let pad = (n, d) => ("000" + n).slice(-d);
2040+
if (!convertToLocalTime) {
2041+
let tzOffset = dt.getTimezoneOffset();// returns the difference in minutes.
2042+
dt.setMinutes(dt.getMinutes() + tzOffset);
2043+
}
20232044
let formatedDate = "";
20242045
let remaining = format;
20252046
while (remaining) {
@@ -2044,6 +2065,23 @@ function RecordTable(vm) {
20442065
} else if (remaining.match(/^SSS/)) {
20452066
remaining = remaining.substring(3);
20462067
formatedDate += ("00" + dt.getMilliseconds()).slice(-3);
2068+
} else if (remaining.match(/^\+/)) { //+0000
2069+
remaining = remaining.substring(1);
2070+
formatedDate += (dt.getTimezoneOffset() <= 0 ? "+" : "-");
2071+
} else if (remaining.match(/^FF/)) { //+0000
2072+
remaining = remaining.substring(2);
2073+
if (convertToLocalTime) {
2074+
formatedDate += pad(Math.floor(Math.abs(dt.getTimezoneOffset()) / 60), 2);
2075+
} else {
2076+
formatedDate += "00";
2077+
}
2078+
} else if (remaining.match(/^ff/)) {
2079+
remaining = remaining.substring(2);
2080+
if (convertToLocalTime) {
2081+
formatedDate += pad(Math.abs(dt.getTimezoneOffset()) % 60, 2);
2082+
} else {
2083+
formatedDate += "00";
2084+
}
20472085
} else {
20482086
formatedDate += remaining[0];
20492087
remaining = remaining.substring(1);

addon/data-load.js

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,6 @@ export class TableModel {
276276
constructor(sfHost, reactCallback) {
277277
this.reactCallback = reactCallback;
278278
this.headerCallout = localStorage.getItem("createUpdateRestCalloutHeaders") ? JSON.parse(localStorage.getItem("createUpdateRestCalloutHeaders")) : "{}";
279-
this.convertToLocalTime = localStorage.getItem("convertToLocalTime") != "false";
280279
this.sfHost = sfHost;
281280
this.data = null;
282281
this.initialRowHeight = 15; // constant: The initial estimated height of a row before it is rendered
@@ -763,8 +762,6 @@ export class TableModel {
763762
dataCell.objectTypes = [];
764763
dataCell.label = cell;
765764
dataCell.linkable = true;
766-
} else if (typeof cell == "string" && this.isDateTimeToConvert(cell)) {
767-
dataCell.label = this.convertDatetimeToLocalTime(cell);
768765
} else if (cell == null) {
769766
dataCell.label = "";
770767
} else {
@@ -780,25 +777,6 @@ export class TableModel {
780777
}
781778
this.didUpdate();
782779
}
783-
isDateTimeToConvert(text) {
784-
if (!this.convertToLocalTime) {
785-
return false;
786-
}
787-
return /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?([+-]\d{4})$/.test(text);
788-
}
789-
convertDatetimeToLocalTime(text) {
790-
let dt = new Date(text);
791-
let tzOffset = dt.getTimezoneOffset();// returns the difference in minutes.
792-
dt.setMinutes(dt.getMinutes() - tzOffset);
793-
let finalDate = dt.toISOString().replace("Z", "");
794-
finalDate += (tzOffset > 0 ? "-" : "+");
795-
tzOffset = Math.abs(tzOffset);
796-
let offsetHours = Math.floor(tzOffset / 60);
797-
let offsetMinutes = tzOffset % 60;
798-
finalDate += String(offsetHours).padStart(2, "0");
799-
finalDate += String(offsetMinutes).padStart(2, "0");
800-
return finalDate;
801-
}
802780

803781
dataChange(newData) {
804782
this.data = newData;

addon/options.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ class OptionsTabSelector extends React.Component {
115115
{option: Option, props: {type: "toggle", title: "Skip technical comlumns", key: "skipTechnicalColumns", default: true}},
116116
{option: Option, props: {type: "toggle", title: "convert date to local timezone", key: "convertToLocalTime", default: true}},
117117
{option: Option, props: {type: "text", title: "Date format", key: "dateFormat", suggestions: ["yyyy-MM-dd", "dd/MM/yyyy", "MM/dd/yyyy"]}},
118-
{option: Option, props: {type: "text", title: "Date time format", key: "datetimeFormat", suggestions: ["yyyy-MM-ddTHH:mm:ss.SSS+/-HH:mm", "dd/MM/yyyy HH:mm:ss.SSS+/-HH:mm"]}},
118+
{option: Option, props: {type: "text", title: "Date time format", key: "datetimeFormat", suggestions: ["yyyy-MM-ddTHH:mm:ss.SSS+FFff", "dd/MM/yyyy HH:mm:ss.SSS+FFff"]}},
119119
{option: Option, props: {type: "option", title: "Decimal format", key: "decimalFormat", default: ".", values: [".", ","]}},
120120
{option: QueryTemplatesOption, props: {title: "Query Templates", key: "queryTemplates", placeholder: "SELECT..."}},
121121
{option: QueryTemplatesOption, props: {title: "Saved Query History", key: "insextSavedQueryHistory", node: "query", withName: true, defaultValue: "{\"useToolingApi\": false}", placeholder: "SELECT..."}}

0 commit comments

Comments
 (0)