diff --git a/src/filters/utcOffset.js b/src/filters/utcOffset.js new file mode 100644 index 00000000..74fc99e9 --- /dev/null +++ b/src/filters/utcOffset.js @@ -0,0 +1,6 @@ +import utils from '../lib/utils.js'; + +export default function (utcOffsetMinutes) { + const utcOffset = utils.getUtcOffsetByUtcOffsetMinutes(utcOffsetMinutes); + return `(UTC${utcOffset})`; +} diff --git a/src/lib/utils.js b/src/lib/utils.js index 88104936..6a93c851 100644 --- a/src/lib/utils.js +++ b/src/lib/utils.js @@ -34,6 +34,39 @@ function isBoolean(val) { return typeof(val) === 'boolean'; } +function getUtcOffsetMinutesByUtcOffset(utcOffset) { + if (!utcOffset) { + return 0; + } + + const parts = utcOffset.split(':'); + + if (parts.length !== 2) { + return 0; + } + + return parseInt(parts[0]) * 60 + parseInt(parts[1]); +} + +function getUtcOffsetByUtcOffsetMinutes(utcOffsetMinutes) { + let offsetHours = parseInt(Math.abs(utcOffsetMinutes) / 60); + let offsetMinutes = Math.abs(utcOffsetMinutes) - offsetHours * 60; + + if (offsetHours < 10) { + offsetHours = '0' + offsetHours; + } + + if (offsetMinutes < 10) { + offsetMinutes = '0' + offsetMinutes; + } + + if (utcOffsetMinutes >= 0) { + return `+${offsetHours}:${offsetMinutes}`; + } else if (utcOffsetMinutes < 0) { + return `-${offsetHours}:${offsetMinutes}`; + } +} + function getTimezoneOffset(timezone) { if (timezone) { return moment().tz(timezone).format('Z'); @@ -43,19 +76,8 @@ function getTimezoneOffset(timezone) { } function getTimezoneOffsetMinutes(timezone) { - const offset = getTimezoneOffset(timezone); - - if (!offset) { - return 0; - } - - const parts = offset.split(':'); - - if (parts.length !== 2) { - return 0; - } - - return parseInt(parts[0]) * 60 + parseInt(parts[1]); + const utcOffset = getTimezoneOffset(timezone); + return getUtcOffsetMinutesByUtcOffset(utcOffset); } function getCurrentUnixTime() { @@ -590,6 +612,8 @@ export default { isString, isNumber, isBoolean, + getUtcOffsetMinutesByUtcOffset, + getUtcOffsetByUtcOffsetMinutes, getTimezoneOffset, getTimezoneOffsetMinutes, getCurrentUnixTime, diff --git a/src/mobile-main.js b/src/mobile-main.js index 8e020c16..9152370d 100644 --- a/src/mobile-main.js +++ b/src/mobile-main.js @@ -72,6 +72,7 @@ import momentFilter from './filters/moment.js'; import percentFilter from './filters/percent.js'; import itemFieldContentFilter from './filters/itemFieldContent.js'; import currencyFilter from './filters/currency.js'; +import utcOffsetFilter from './filters/utcOffset.js'; import iconFilter from './filters/icon.js'; import iconStyleFilter from './filters/iconStyle.js'; import defaultIconColorFilter from './filters/defaultIconColor.js'; @@ -153,6 +154,7 @@ Vue.filter('moment', (value, format) => momentFilter(value, format)); Vue.filter('percent', (value, precision, lowPrecisionValue) => percentFilter(value, precision, lowPrecisionValue)); Vue.filter('itemFieldContent', (value, fieldName, defaultValue, translate) => itemFieldContentFilter({ i18n }, value, fieldName, defaultValue, translate)); Vue.filter('currency', (value, currencyCode) => currencyFilter({ i18n }, value, currencyCode)); +Vue.filter('utcOffset', (value) => utcOffsetFilter(value)); Vue.filter('icon', (value, iconType) => iconFilter(value, iconType)); Vue.filter('iconStyle', (value, iconType, defaultColor, additionalFieldName) => iconStyleFilter(value, iconType, defaultColor, additionalFieldName)); Vue.filter('defaultIconColor', (value, defaultColor) => defaultIconColorFilter(value, defaultColor)); @@ -188,6 +190,7 @@ Vue.prototype.$webauthn = webauthn; Vue.prototype.$settings = settings; Vue.prototype.$locale = { defaultTimezoneOffset: utils.getTimezoneOffset(), + defaultTimezoneOffsetMinutes: utils.getTimezoneOffsetMinutes(), getDefaultLanguage: getDefaultLanguage, getAllLanguages: getAllLanguages, getLanguage: getLanguage, @@ -222,6 +225,7 @@ Vue.prototype.$locale = { allTimezoneInfos.push({ name: allTimezones[i].timezoneName, utcOffset: (allTimezones[i].timezoneName !== 'Etc/GMT' ? utils.getTimezoneOffset(allTimezones[i].timezoneName) : ''), + utcOffsetMinutes: utils.getTimezoneOffsetMinutes(allTimezones[i].timezoneName), displayName: i18n.t(`timezone.${allTimezones[i].displayName}`) }); } @@ -230,6 +234,7 @@ Vue.prototype.$locale = { allTimezoneInfos.push({ name: '', utcOffset: this.defaultTimezoneOffset, + utcOffsetMinutes: this.defaultTimezoneOffsetMinutes, displayName: i18n.t('System Default') }); } diff --git a/src/views/mobile/transactions/List.vue b/src/views/mobile/transactions/List.vue index 9e12544e..74f56052 100644 --- a/src/views/mobile/transactions/List.vue +++ b/src/views/mobile/transactions/List.vue @@ -871,28 +871,6 @@ export default { applyTimezoneOffset(unixTime, utcOffsetMinutes, currentTimezoneOffsetMinutes) { return unixTime + (utcOffsetMinutes - currentTimezoneOffsetMinutes) * 60; }, - utcOffset(utcOffsetMinutes) { - let offsetHours = parseInt(Math.abs(utcOffsetMinutes) / 60); - let offsetMinutes = Math.abs(utcOffsetMinutes) - offsetHours * 60; - - if (offsetHours < 10) { - offsetHours = '0' + offsetHours; - } - - if (offsetMinutes < 10) { - offsetMinutes = '0' + offsetMinutes; - } - - let utcOffset = ''; - - if (utcOffsetMinutes > 0) { - utcOffset = `+${offsetHours}:${offsetMinutes}`; - } else if (utcOffsetMinutes < 0) { - utcOffset = `-${offsetHours}:${offsetMinutes}`; - } - - return `(UTC${utcOffset})`; - }, dateRangeName(dateRangeType, allDateRanges, defaultName) { if (dateRangeType === allDateRanges.All.type) { return defaultName;