Timezone Converter


This is a template page used internally by the SCP Wiki.


[[iftags +template]]

What this is

A bunch of miscellaneous CSS improvements. "Improvements" is subjective. I do not care.

If you're not me, which you're not (I think), then you definitely shouldn't use this component because it may break, disappear, or change in a way that you don't like at any time; and I promise you that if I want to add something to this I will without asking your permission or checking whether or not it breaks your article. There's a reason this isn't on the main wiki. But other than that go wild.


[[include :topia:cqb:css]]

Using this on a page tagged 'template'? You'll need to manually stop all these usage instructions from appearing:

[[div style="display: none;"]]
[[include :topia:cqb:css]]


Reasonably-sized footnotes

Stops footnotes from being a million miles wide, so that you can actually read them.

.hovertip { max-width: 400px; }

I'd add a demonstration, but I've included this component to a bunch of other template pages and it messes them up. You'll just have to trust me on this one.

Monospace edit/code

Makes the edit textbox monospace, and also changes all monospace text to Fira Code, the obviously superior monospace font.

    font-family: 'Fira Code';
    src: url('https://raw.githubusercontent.com/tonsky/FiraCode/master/distr/eot/FiraCode-Regular.eot') format('embedded-opentype'),
    url('https://raw.githubusercontent.com/tonsky/FiraCode/master/distr/woff2/FiraCode-Regular.woff2') format('woff2'),
    url('https://raw.githubusercontent.com/tonsky/FiraCode/master/distr/woff/FiraCode-Regular.woff') format('woff'),
    url('https://raw.githubusercontent.com/tonsky/FiraCode/master/distr/ttf/FiraCode-Regular.ttf') format('truetype');
    font-weight: normal;
    font-style: normal;
:root { --mono-font: "Fira Code", Cousine, monospace; }
#edit-page-textarea, .code pre, .code p, .code, tt, .page-source { font-family: var(--mono-font); }
.code pre * { white-space: pre; }
.code *, .pre * { font-feature-settings: unset; }

Fuck off bigfaces

Stops big pictures from appearing when you hover over someone's avatar image, because they're stupid and I hate them.

.avatar-hover { display: none !important; }

Breaky breaky

Break links if I want them to

.nobreak { word-break: break-all; }

Code colours

Add my terminal's code colours as variables

:root {
  --c-bg: #393939;
  --c-syntax: #e0e0e0;
  --c-comment: #999999;
  --c-error: #f2777a;
  --c-value: #f99157;
  --c-symbol: #ffcc66;
  --c-string: #99cc99;
  --c-operator: #66cccc;
  --c-builtin: #70a7df;
  --c-keyword: #cc99cc;
.terminal {
  color: var(--c-syntax);
  background: var(--c-bg);
  border: 0.5rem solid var(--c-comment);
  border-radius: 2rem;

Debug mode

Draw lines around anything inside .debug-mode.

.debug-mode, .debug-mode *, .debug-mode *::before, .debug-mode *::after {
  outline: 1px solid var(--debug-colour, red);
.debug-info {
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
  font-family: 'Fira Code', monospace;
  font-size: 1rem;
  white-space: nowrap;
.debug-info.over { top: -2.5rem; }
.debug-info.under { bottom: -2.5rem; }
.debug-info p { margin: 0; }


What this is

A component that displays a given time and/or date in the reader's timezone.

The reader's timezone will be automatically calculated. All you need to do is input the timezone of the time you want on the page.

If your timezone matches the reader's timezone, this module will not appear. This is intentional! It will still be there for readers who need it.

Please note the following Daylight Savings Time exceptions: both "EST" and "EDT", when entered into this component, are converted to the America/New_York timezone, which is then converted to either EST or EDT depending on the time of year. "BST" is converted to Europe/London, which is then converted to either GMT or BST depending on the time of year. To avoid this confusion, please avoid using timezones that vary depending on DST! Use a static timezone like UTC.


On any wiki:

[[include :scp-wiki:component:tz
| time=18:00
| tz=UTC

A setting in italics is optional. Everything else you gotta have. If you omit an optional setting, then it will have its default value. If you omit a non-optional setting, then don't expect the component to work properly.

To omit a setting, leave it out completely.

time The time of the event. Times should be two digits followed by a colon followed by two digits. "18:30" is good. "1830", "6:30 PM" and "half past six in the afternoon" are bad.
The timezone of the time that you're entering.
Default value: UTC
The date of the event in ISO format: YYYY-MM-DD.
The date might be used at some point to calculate "time until" stuff, but right now it's unused.
Default value: today
The text that comes before the converted time.
Default value: "${time} ${tz} is "
The text that comes after the converted time.
Default value: "."


HTML structure of the converter

Unfortunately this is buried in the source code - you'll have to go digging for it!

JS to operate the converter

document.addEventListener("DOMContentLoaded", function() {
  date = date === "{$date}" ? moment().format("Y-MM-DD") : date;
  tz = tz === "{$tz}" ? "UTC" : tz;
  tz = tz === "EST" ? "America/New_York" : tz;
  tz = tz === "EDT" ? "America/New_York" : tz;
  tz = tz === "BST" ? "Europe/London" : tz;
  given_time = moment.tz(date + " " + time, tz);
  tz = given_time.format("z");
  text_before = text_before === "{$text_before}" ? "${time} ${tz} is " : 
  text_after = text_after === "{$text_after}" ? "." : text_after;
  // eval is used here to convert text strings to template literals
  // variables of the form ${var} will be parsed
  text_before = eval('`' + text_before + '`');
  text_after = eval('`' + text_after + '`');
  user_tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
  converted_time = given_time.tz(user_tz);
  converted_time_tz = converted_time.format("HH:mm z");
  document.getElementById("text_before").textContent = text_before;
  document.getElementById("text_converted").textContent = converted_time_tz;
  document.getElementById("text_after").textContent = text_after;
  if (converted_time.format("z") === tz) {
    // e.g. displaying an EST time to an EST user - that's pointless!
    document.documentElement.style.display = 'none';

CSS to style the output wrapper

.timezone-thingy { margin-top: -0.5rem; }
.timezone-thingy iframe { border: none; max-height: 3.5rem; }

CSS to style the output internally

#wrapper {
  padding: 0.5rem !important;
  border: 1px solid #660000;
  border-radius: 10px;
  box-shadow: 0 2px 6px rgba(102,0,0,.5);
  background: white;
  margin: 0.5rem 0;
  display: inline-block;
  position: relative;
  left: 50%;
  transform: translateX(-50%);
#wrapper p {
  margin: 0;
#wrapper img {
  height: 1rem;
  vertical-align: text-top;
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License