# Some takes on UV & cancer

**Table of contents:**

*   Part 1: In which I use my optical physics background to share some hopefully-uncontroversial observations
*   Part 2: In which I boldly defy Public Health Orthodoxy on the whole UV situation

Part 1: In which I use my optical physics background to share some hopefully-uncontroversial observations
=========================================================================================================

1.1 UV depends a lot on “solar zenith angle” \[a.k.a. “angle of the sun away from directly overhead”\], not on how hot it is outside
------------------------------------------------------------------------------------------------------------------------------------

That means: you should mainly be thinking about UV exposure in proportion to how close it is to (1) the summer solstice and (2) solar noon.[^7v92nxt4w3f]

Here, I made this handy widget.[^dci2o3bfsh5] Select a city in the drop-down at the bottom, and mouse over (or tap) the colored area for specific datapoints:

```widget[8PLrRhTiLompRMCBb]
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Solar Zenith Angle Heatmap</title>

  <!-- Load Plotly for the heatmap -->
  <script src="https://cdn.plot.ly/plotly-2.27.0.min.js"></script>
  <!-- Load SunCalc for solar position math -->
  <script src="https://cdnjs.cloudflare.com/ajax/libs/suncalc/1.9.0/suncalc.min.js"></script>
  <!-- Load Luxon for accurate Timezone and DST handling -->
  <script src="https://cdnjs.cloudflare.com/ajax/libs/luxon/3.4.4/luxon.min.js"></script>

  <style>
    body {
      margin: 0;
      padding: 0;
      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
      background-color: #f4f4f9;
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      height: 100vh;
      overflow: hidden;
    }
    #widget-container {
      width: 100%;
      max-width: 900px;
      background: white;
      border-radius: 12px;
      box-shadow: 0 8px 16px rgba(0,0,0,0.1);
      padding: 20px;
      box-sizing: border-box;
      display: flex;
      flex-direction: column;
      height: 95vh;
    }
    #plot-container {
      flex-grow: 1;
      width: 100%;
      min-height: 0; /* Ensures Plotly resizes correctly */
    }
    .controls {
      display: flex;
      justify-content: center;
      align-items: center;
      margin-top: 15px;
      padding-top: 15px;
      border-top: 1px solid #ddd;
    }
    label {
      font-weight: 600;
      margin-right: 12px;
      color: #333;
    }
    select {
      font-size: 16px;
      padding: 6px 12px;
      border-radius: 6px;
      border: 1px solid #ccc;
      cursor: pointer;
      background-color: white;
      transition: border-color 0.2s;
    }
    select:focus {
      outline: none;
      border-color: #007bff;
    }
  </style>
</head>
<body>

  <div id="widget-container">
    <div id="plot-container"></div>
    <div class="controls">
      <label for="city-select">Select Location:</label>
<select id="city-select">
        <!-- Northern Hemisphere -->
        <option value="ANC">Anchorage (61.2° N)</option>
        <option value="DUB">Dublin (53.3° N)</option>
        <option value="LON">London (51.5° N)</option>
        <option value="YVR">Vancouver (49.3° N)</option>
        <option value="BOS">Boston (42.4° N)</option>
        <option value="CHI">Chicago (41.9° N)</option>
        <option value="SF" selected>San Francisco (37.8° N)</option>
        <option value="TYO">Tokyo (35.7° N)</option>
        <option value="HNL">Honolulu (21.3° N)</option>
        
        <!-- Equator -->
        <option value="SIN">Singapore (1.4° N)</option>
        
        <!-- Southern Hemisphere -->
        <option value="JNB">Johannesburg (26.2° S)</option>
        <option value="SYD">Sydney (33.9° S)</option>
        <option value="WLG">Wellington (41.3° S)</option>
      </select>
<!--      <select id="city-select">
        <option value="SF">San Francisco</option>
        <option value="BOS">Boston</option>
        <option value="LON">London</option>
        <option value="TYO">Tokyo</option>
        <option value="SYD">Sydney</option>
      </select>-->
    </div>
  </div>

  <script>
    // Define cities with their coordinates and IANA timezone strings
    const cities = {
      ANC: { name: 'Anchorage', lat: 61.2181, lon: -149.9003, tz: 'America/Anchorage' },
      DUB: { name: 'Dublin', lat: 53.3498, lon: -6.2603, tz: 'Europe/Dublin' },
      LON: { name: 'London', lat: 51.5074, lon: -0.1278, tz: 'Europe/London' },
      YVR: { name: 'Vancouver', lat: 49.2827, lon: -123.1207, tz: 'America/Vancouver' },
      BOS: { name: 'Boston', lat: 42.3601, lon: -71.0589, tz: 'America/New_York' },
      CHI: { name: 'Chicago', lat: 41.8781, lon: -87.6298, tz: 'America/Chicago' },
      SF:  { name: 'San Francisco', lat: 37.7749, lon: -122.4194, tz: 'America/Los_Angeles' },
      TYO: { name: 'Tokyo', lat: 35.6762, lon: 139.6503, tz: 'Asia/Tokyo' },
      HNL: { name: 'Honolulu', lat: 21.3069, lon: -157.8583, tz: 'Pacific/Honolulu' },
      SIN: { name: 'Singapore', lat: 1.3521, lon: 103.8198, tz: 'Asia/Singapore' },
      JNB: { name: 'Johannesburg', lat: -26.2041, lon: 28.0473, tz: 'Africa/Johannesburg' },
      SYD: { name: 'Sydney', lat: -33.8688, lon: 151.2093, tz: 'Australia/Sydney' },
      WLG: { name: 'Wellington', lat: -41.2865, lon: 174.7762, tz: 'Pacific/Auckland' }
    };

    const DateTime = luxon.DateTime;

    function renderPlot(cityKey) {
      const city = cities[cityKey];
      
      const xRaw = []; // Local time axis (hours)
      const yRaw = []; // Date axis
      const zRaw = []; // Zenith angle

      // Generate time slots (5:00 to 19:00 at 10-minute intervals for smooth gradients)
      for (let h = 5; h <= 19; h += 10 / 60) {
        xRaw.push(h);
      }

      // To ensure the Northern Hemisphere summer solstice (June 21) is perfectly in the middle,
      // we start the Y-axis on the previous Winter Solstice (Dec 21) and go for 365 days.
      const startDate = DateTime.fromObject({ year: 2025, month: 12, day: 21 }, { zone: city.tz });

      for (let d = 0; d <= 365; d++) {
        const currentDate = startDate.plus({ days: d });
        yRaw.push(currentDate.toISODate()); // Keeps plot axis correctly formatted as Dates
        
        const zRow = [];
        
        for (let x of xRaw) {
          const hour = Math.floor(x);
          const minute = Math.round((x - hour) * 60);
          
          // Construct the exact local time. Luxon handles the DST conversion automatically.
          const localTime = currentDate.set({ hour: hour, minute: minute });
          
          // Convert back to JS Date (UTC mapped) for SunCalc position math
          const jsDate = localTime.toJSDate();
          
          // Calculate solar altitude, then convert to zenith angle (90 - altitude)
          const pos = SunCalc.getPosition(jsDate, city.lat, city.lon);
          const altitudeDeg = pos.altitude * (180 / Math.PI);
          const zenith = 90 - altitudeDeg;
          
          zRow.push(zenith);
        }
        zRaw.push(zRow);
      }

      // X-Axis formatting logic
      const tickVals = [];
      const tickText = [];
      for (let h = 5; h <= 19; h++) {
        tickVals.push(h);
        tickText.push(`${h}:00`);
      }

      // Custom Color Scale
      // 0° (overhead)   -> Bright Yellow
      // 90° (horizon)   -> Deep Red
      // >90° (night)    -> Dark Blue / Black
      // Mapped relative to a 0-120 degree range
      const colorscale = [
        [0.00, '#ffffff'],      // 0° (Overhead) - White
        [0.15, '#ffff00'],      // 18° - Bright Yellow
        [0.25, '#32cd32'],      // 36° - Lime Green
        [0.35, '#00bfff'],      // 54° - Sky Blue
        [0.45, '#8a2be2'],      // 72° - Purple
        [0.75, '#ff1493'],      // 90° (Horizon) - Deep Pink/Red
        [0.75, '#0a0a2a'],      // 90°+ (Sharp transition to Night)
        [1.00, '#000000']       // 120° (Deep night)
//      const colorscale = [
//        [0.0, '#ffffcc'],       // 0°
//        [0.2, '#ffeda0'],       // 24°
//        [0.4, '#feb24c'],       // 48°
//        [0.6, '#f03b20'],       // 72°
//        [0.75, '#800026'],      // 90° (Horizon line)
//        [0.75, '#0a0a2a'],      // 90°+ (Sharp transition to Night)
//        [1.0, '#000000']        // 120° (Deep night)
      ];

      // Prepare custom hover text
      const hoverText = zRaw.map((row) => 
        xRaw.map(x => {
          const h = Math.floor(x.toFixed(10));
          const m = Math.round((x.toFixed(10) - h) * 60).toString().padStart(2, '0');
          return `${h}:${m}`;
        })
      );

      const data = [{
        z: zRaw,
        x: xRaw,
        y: yRaw,
        type: 'heatmap',
        colorscale: colorscale,
        zmin: 0,
        zmax: 120, // Caps scaling at 120 so the 90° horizon always lands precisely at 0.75 on the scale
        colorbar: {
          title: 'Zenith<br>Angle (°)',
          tickvals: [0, 20, 40, 60, 80, 90, 100, 120],
          ticktext: ['0°', '20°', '40°', '60°', '80°', '90° (Horizon)', '100°', '120°']
        },
        hovertemplate: 
          '<b>Date:</b> %{y}<br>' +
          '<b>Local Time:</b> %{text}<br>' +
          '<b>Angle:</b> %{z:.1f}°<extra></extra>',
        text: hoverText
      }];

      const layout = {
        title: `Solar Zenith Angle - ${city.name}`,
        margin: { t: 50, r: 20, b: 50, l: 60 },
        xaxis: {
          title: 'Time of Day',
          tickvals: tickVals,
          ticktext: tickText,
          range: [5, 19],
          fixedrange: true // Locks pan/zoom on X
        },
        yaxis: {
          title: 'Date',
          fixedrange: true, // Locks pan/zoom on Y
		  tickformat: '%b %d'
        }
      };

      Plotly.newPlot('plot-container', data, layout, { responsive: true, displayModeBar: false });
    }

    // Initial render
    renderPlot('SF');

    // Handle dropdown changes
    document.getElementById('city-select').addEventListener('change', (event) => {
      renderPlot(event.target.value);
    });
  </script>
</body>
</html>
```

I find that people intuitively judge sunburn risk based on temperatures being high, instead of shadows being short. So they worry about UV too much in the hot late summer, and/or not enough in the cool early spring; and they worry about UV too much in hot late afternoons, and/or not enough in cool late mornings.

(Of course, temperature matters *indirectly*, because if it’s hot, you’re probably more likely to be outside, and also less likely to be covered by clothes.)

Here’s an example plot showing how UV exposure falls off with solar zenith angle (SZA) at some location:

![image.png](https://res.cloudinary.com/lesswrong-2-0/image/upload/v1775755787/lexical_client_uploads/wkvnqwtuhvpkunlmrxba.png)

Left: sunburn-causing UV. Right: wrinkle-causing UV. [Source](https://uv.substack.com/p/diurnal-variability-in-uv).

Looks like the wrinkle-causing UV is roughly proportional to the cosine of SZA, while the sunburn-causing UV falls off with angle a bit faster.

If this all sounds to you like a small effect (“only” 2× difference in sunburn-rate between 20° vs 45° SZA), then see §2.3 below.

1.2 Other things matter too, so just check your local UV index
--------------------------------------------------------------

Solar zenith angle is important, but ozone, clouds, and elevation are important too, and there are additional minor things on top of that. So just install a weather app that shows the current UV index (or better yet, a forecast of UV index over the day).

By the way, [UV index](https://en.wikipedia.org/wiki/Ultraviolet_index) is a linear scale, so e.g. you get the same cumulative dose from 1 hour at UV index 10, versus 2 hours at UV index 5. (Consensus seems to be that “cumulative dose” over the course of a day is what actually matters. Seems plausible.)

1.3 Around half of UV is diffuse (mostly coming from the blue sky) not direct
-----------------------------------------------------------------------------

(Specifically, Figure 6 [here](https://arxiv.org/abs/1903.11538v2) seems to suggest that maybe 40% of UVA \[which causes wrinkles\] and 50% of UVB \[which causes burns\] is diffuse, although the ratio depends on solar zenith angle, atmospheric conditions, etc.)

So if you’re sitting in a narrow spot of shade, with almost full view of the blue sky, the amount of *visible* light hitting you might be 5× lower, but you might get a sunburn only 2× slower.

(Don’t get me wrong—2× slower is still a big deal! See §2.3 below.)

Part 2: In which I boldly defy Public Health Orthodoxy on the whole UV situation
================================================================================

\[…Well, “boldly” is the wrong word. This is “strong opinions, weakly held”. Even I myself am too nervous to fully act on these opinions; instead I kinda split the difference between Public Health Orthodoxy and what I actually believe. And I certainly wouldn’t suggest that readers make health decisions based on poorly-researched contrarian blog posts by randos on the internet.\]

Public Health Orthodoxy in the USA—or at least my vague impression from the messaging that trickles down to me and my non-scientist friends and neighbors—is something like: *“sunlight and UV are dangerous, and you should stay safe by always wearing sunscreen and sunglasses”*.

My current thinking is that this has some kernels of truth, but is oversimplified and misleading. In particular, if sunlight-without-sunscreen causes deadly skin cancers, then why is the correlation between sunscreen use and deadly skin cancers so weak (after controlling for confounders like skin fairness and sun exposure)? [This 2003 review](https://scholar.google.com/scholar?cluster=9159808495003605300&oi=gsb&hl=en&as_sdt=0,22) found no effect, and neither did [this 2018 review](https://link.springer.com/article/10.1684/ejd.2018.3251). (Indeed, the latter found a small, non-significant *increase* in skin cancer from sunscreen!)

Also, it’s worth noting that our ancestors have been outside all day every day for millions of years.[^1l6ew7zfjmt] So UV-induced health problems are only plausible if they’re pretty rare, mild, and/or late-in-life, albeit with some caveats.[^qw8corc4a0p]

So anyway, here’s where I’m at right now.

2.1 I lean towards: (1) sunburns are bad, (2) tans are neutral (in themselves), (3) tans are good all things considered (because they prevent sunburns), (4) Sunscreen is for *sudden transitions* in sun exposure, and then you should try to wean off it
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

(…This is *only* in terms of deadly skin cancer; no comment on wrinkles etc.)

The evidence linking sun*burns* to skin cancer seems quite robust. Also, sunburns are painful. So we should definitely be avoiding sunburns.

If you get some unprotected sun exposure, but not enough for a sunburn, then you instead get a tan. So what about tans?[^5b92dafx0km] Are they linked to skin cancer?

My answer: The best I can tell right now is that if tans are bad at all, they’re very very much less bad than sunburns.

For example, there are people who work outside, without a shirt or sunscreen, basically all day every day for months on end. Maybe they have 50× more sun exposure than an office worker. Do they get 50× more skin cancer? No way. This would be a huge, easily-observable effect, and as far as I can tell, it has not been observed.

Do they get *any* more skin cancer than office workers? Maybe slightly—e.g. 20% more in [this study of agricultural workers](https://www.sciencedirect.com/science/article/pii/S0160412021004505). Or, maybe not even slightly—there are enough confounders (e.g. sunburns, exposure to pesticide & fertilizers) that this little 20% effect might be unrelated to tans. So if sun-tans carry any cancer risk at all, I’m rounding it to zero.

So, if tans are neutral in themselves, then that means tans are *good* all-things-considered, because they prevent sunburns. It’s nature’s sunscreen.[^22cqlzxct0w]

So my claim is: if you’ve been getting a similar amount of sun exposure every day (or every few days or whatever), then you can get into a rhythm where you never wear sunscreen, and never get sunburned, because you always have an appropriate tan. *And this is fine*. Indeed, it’s better than sunscreen, because you don’t have to worry about getting burned whenever you miss a spot, or when you sweat it off, or when you forget to pack it, etc. (Plus the sunscreen itself is annoying, and might or might not have health risks of its own.)

Sunscreen would be important during *sudden transitions*. Maybe you’ve been wearing a shirt every day, but today you’re in a bikini for hours. Or you’re inside all day during school, but it just ended and now it’s summer break. Or you have a desk job but you’re flying off to a tropical cruise. With sudden transitions like that, you’re a sitting duck with no protective tan, and you need sunscreen (and/or clothing, shade, etc.) to avoid getting burned.

But the idea would be to wean off it. For example, instead of putting on sunscreen before going out, set a timer and put it on after some time in the sun (which you can ramp up over time). (Also good for Vitamin D!)

2.2 Wear sunglasses for comfort if you want, but they’re not a health product
-----------------------------------------------------------------------------

UV is a risk factor for cataracts. But also, spending lots of time in full sunlight seems to be protective against nearsightedness. So for people with good vision,[^ffdo9oy1c4s] wearing sunglasses would presumably trade off cataracts versus nearsightedness.[^1s7ywyhd1un]

For kids, that seems like a bad trade. The cataracts in question would be developing in like 2080, which will be a very different world. If the superintelligent AI apocalypse or utopia hasn’t come by then, we should at least have better much cataract treatments. By contrast, nearsightedness is annoying and immediate.

(My own kids do have sunglasses, and if they want to wear them, that’s fine with me! But I’m not *proactively encouraging them* to wear sunglasses, the way some parents do.)

For adults, the nearsightedness-vs-cataracts tradeoff is less obvious, but I still think it goes weakly in the anti-sunglasses direction, at least for people like me who are spending most of their life indoors.

(But I absolutely do wear sunglasses when I’m driving in glare, for safety.)

2.3 An appropriate “effective SPF” in most situations is usually like 3, maybe up to 10 tops
--------------------------------------------------------------------------------------------

The math here is pretty simple, but it took a long time before I really thought it through.

As background, SPF (Sun Protection Factor) is a linear factor on sun exposure. I.e., in theory, you get the same UV exposure from e.g. 1 minute with no sunscreen versus 20 minutes with “effective SPF” 20.

(I’m using the term “effective SPF” because you can have a sunscreen labeled “SPF 20” on the bottle, but you apply it too thinly, or it’s not mixed properly, or whatever, and so you wind up with “effective SPF” much less than 20.)

Now, this will be different for different people (e.g. infants burn especially quickly), but I’m a white guy with usually no tan (since I’m usually inside all day), and if memory serves, I’m nevertheless always fine for 30 minutes, maybe more, in almost-overhead sunlight (at sea level), before I start to burn. That suggests that for me, “effective SPF” of 5-10 would probably get me from dawn to dusk on a maximally sunny day without burning, even with no tan at all.

Indeed, even “effective SPF” of 2 or 3 would often be enough! This explains why solar zenith angle (§1.1) makes such a big difference in practice, as does shade (§1.3), tans (§2.1), etc.

(Also, dry white t-shirts are supposedly only SPF 5-10, and I don’t recall ever getting a sunburn through a white t-shirt. Or even really a tan. And I don’t *think* I wear unusually-densely-woven t-shirts?)

…So why do people sell and use sunscreen with way way higher nominal SPFs, like 30 or more? I think part of it is the difference between nominal SPF and “effective SPF” from poor application, etc., mentioned above? (But then shouldn’t you be focusing less on the nominal SPF and more on how easy it is to properly apply?) Or maybe part of it is that a high SPF for UVB may be a barely-adequate SPF for UVA or vice-versa? Or people just buy crazy-high SPF because higher numbers seem better? I dunno.

[^7v92nxt4w3f]: Solar noon is the time of day when the sun is highest in the sky. It mainly depends on your time zone and longitude, and I think for most places it falls somewhere between 12:00 and 1:00pm. You can just look it up for where you live (see widget below), but note that it shifts by an hour due to daylight savings, plus it bounces around slightly (maybe ±15 minutes) due to orbital stuff I don’t understand. 

[^dci2o3bfsh5]: Thanks Gemini 3.1 Pro 

[^1l6ew7zfjmt]: People sometimes object to this argument on the grounds that the UV situation today is dramatically different today than in the past, because of CFCs depleting the ozone layer. But I’m pretty sure that’s wrong. Thanks to the Montreal Protocol, ozone depletion never really got that bad. Indeed, the extra UV exposure you get from CFC-related ozone depletion is less than the extra UV exposure you would get by moving a mere 200 km closer to the equator. (Source.) 

[^qw8corc4a0p]: This argument doesn’t rule out health problems from e.g. light-skinned people of Scandinavian heritage living at the equator, or interactions between UV exposure and diet, or various other caveats. So it’s not a strong argument, but I think it’s context that’s worth keeping in mind as one reads the literature. 

[^5b92dafx0km]: I’m only talking about real sun-tans, not tanning beds, which I didn’t look into, they’re not my scene. 

[^22cqlzxct0w]: I guess some people have a skin type where they don’t tan at all? I don’t know what to make of that. Is it just impossible for those people to be outside every day year-round without sunscreen?? Like, what were their ancestors doing 500 years ago?? My hunch is instead that their skin “gets used to” sun exposure in some other way that doesn’t involve visible tans. But I dunno. YMMV. 

[^ffdo9oy1c4s]: If you wear glasses or contacts outside, then you can check whether they block UV. If they do, then I guess you get the best of both worlds, and sunglasses would seem to become a pure eye-health negative. 

[^1s7ywyhd1un]: I’m assuming the sunglasses reduce the UV and not just the visible light. Not sure how common that is. If your sunglasses are letting the UV through, then that’s the worst of both worlds.