diff --git a/app/assets/javascripts/discourse/app/lib/local-dates.js b/app/assets/javascripts/discourse/app/lib/local-dates.js
new file mode 100644
index 00000000000..65ec52d322f
--- /dev/null
+++ b/app/assets/javascripts/discourse/app/lib/local-dates.js
@@ -0,0 +1,11 @@
+export function applyLocalDates(dates, siteSettings) {
+  if (!siteSettings.discourse_local_dates_enabled) {
+    return;
+  }
+
+  const _applyLocalDates = requirejs(
+    "discourse/plugins/discourse-local-dates/initializers/discourse-local-dates"
+  ).applyLocalDates;
+
+  _applyLocalDates(dates, siteSettings);
+}
diff --git a/plugins/discourse-local-dates/assets/javascripts/discourse/components/discourse-local-dates-create-form.js b/plugins/discourse-local-dates/assets/javascripts/discourse/components/discourse-local-dates-create-form.js
index c2a2f5f6a4e..f14cd730146 100644
--- a/plugins/discourse-local-dates/assets/javascripts/discourse/components/discourse-local-dates-create-form.js
+++ b/plugins/discourse-local-dates/assets/javascripts/discourse/components/discourse-local-dates-create-form.js
@@ -13,6 +13,7 @@ import { notEmpty } from "@ember/object/computed";
 import { propertyNotEqual } from "discourse/lib/computed";
 import { schedule } from "@ember/runloop";
 import { getOwner } from "discourse-common/lib/get-owner";
+import { applyLocalDates } from "discourse/lib/local-dates";
 
 export default Component.extend({
   timeFormat: "HH:mm:ss",
@@ -56,19 +57,21 @@ export default Component.extend({
     });
   },
 
-  @observes("markup")
+  @observes("computedConfig.{from,to,options}", "options", "isValid", "isRange")
   _renderPreview() {
     discourseDebounce(
       this,
       function () {
         const markup = this.markup;
-
         if (markup) {
           cookAsync(markup).then((result) => {
             this.set("currentPreview", result);
-            schedule("afterRender", () =>
-              this.$(".preview .discourse-local-date").applyLocalDates()
-            );
+            schedule("afterRender", () => {
+              applyLocalDates(
+                document.querySelectorAll(".preview .discourse-local-date"),
+                this.siteSettings
+              );
+            });
           });
         }
       },
@@ -321,7 +324,6 @@ export default Component.extend({
         text = this._generateDateMarkup(config.from, options, isRange);
       }
     }
-
     return text;
   },
 
diff --git a/plugins/discourse-local-dates/assets/javascripts/initializers/discourse-local-dates.js b/plugins/discourse-local-dates/assets/javascripts/initializers/discourse-local-dates.js
index 19136629a07..edb003a6a69 100644
--- a/plugins/discourse-local-dates/assets/javascripts/initializers/discourse-local-dates.js
+++ b/plugins/discourse-local-dates/assets/javascripts/initializers/discourse-local-dates.js
@@ -8,6 +8,7 @@ import { downloadCalendar } from "discourse/lib/download-calendar";
 import { renderIcon } from "discourse-common/lib/icon-library";
 import I18n from "I18n";
 
+// Import applyLocalDates from discourse/lib/local-dates instead
 export function applyLocalDates(dates, siteSettings) {
   if (!siteSettings.discourse_local_dates_enabled) {
     return;
diff --git a/plugins/discourse-local-dates/test/javascripts/acceptance/local-dates-composer-test.js b/plugins/discourse-local-dates/test/javascripts/acceptance/local-dates-composer-test.js
index b45d5e440f2..5c54bc937a8 100644
--- a/plugins/discourse-local-dates/test/javascripts/acceptance/local-dates-composer-test.js
+++ b/plugins/discourse-local-dates/test/javascripts/acceptance/local-dates-composer-test.js
@@ -1,6 +1,11 @@
-import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers";
+import {
+  acceptance,
+  query,
+  queryAll,
+} from "discourse/tests/helpers/qunit-helpers";
 import { test } from "qunit";
 import { click, fillIn, visit } from "@ember/test-helpers";
+import selectKit from "discourse/tests/helpers/select-kit-helper";
 
 acceptance("Local Dates - composer", function (needs) {
   needs.user();
@@ -61,4 +66,19 @@ acceptance("Local Dates - composer", function (needs) {
     );
     assert.notOk(getAttr("time"), "it doesn’t have time");
   });
+
+  test("date modal", async function (assert) {
+    await visit("/");
+    await click("#create-topic");
+    await click(".d-editor-button-bar .local-dates");
+
+    const timezoneChooser = selectKit(".timezone-input");
+    await timezoneChooser.expand();
+    await timezoneChooser.selectRowByValue("Asia/Macau");
+
+    assert.ok(
+      query(".preview .discourse-local-date").textContent.includes("Macau"),
+      "it outputs a preview date in selected timezone"
+    );
+  });
 });
diff --git a/plugins/poll/assets/javascripts/widgets/discourse-poll.js b/plugins/poll/assets/javascripts/widgets/discourse-poll.js
index 580ca6eeff4..915309ea0b2 100644
--- a/plugins/poll/assets/javascripts/widgets/discourse-poll.js
+++ b/plugins/poll/assets/javascripts/widgets/discourse-poll.js
@@ -14,17 +14,15 @@ import { relativeAge } from "discourse/lib/formatter";
 import round from "discourse/lib/round";
 import showModal from "discourse/lib/show-modal";
 import bootbox from "bootbox";
+import { applyLocalDates } from "discourse/lib/local-dates";
 
 const FETCH_VOTERS_COUNT = 25;
 
-function optionHtml(option) {
-  const $node = $(`<span>${option.html}</span>`);
-
-  $node.find(".discourse-local-date").each((_index, elem) => {
-    $(elem).applyLocalDates();
-  });
-
-  return new RawHtml({ html: `<span>${$node.html()}</span>` });
+function optionHtml(option, siteSettings = {}) {
+  const el = document.createElement("span");
+  el.innerHTML = option.html;
+  applyLocalDates(el.querySelectorAll(".discourse-local-date"), siteSettings);
+  return new RawHtml({ html: `<span>${el.innerHTML}</span>` });
 }
 
 function infoTextHtml(text) {
@@ -66,7 +64,7 @@ createWidget("discourse-poll-option", {
     }
 
     contents.push(" ");
-    contents.push(optionHtml(option));
+    contents.push(optionHtml(option, this.siteSettings));
 
     return contents;
   },
@@ -178,7 +176,10 @@ createWidget("discourse-poll-standard-results", {
         contents.push(
           h(
             "div.option",
-            h("p", [h("span.percentage", `${per}%`), optionHtml(option)])
+            h("p", [
+              h("span.percentage", `${per}%`),
+              optionHtml(option, this.siteSettings),
+            ])
           )
         );